I want to create a many-to-many relationship using EF 6 using a code-first approach. My entities use a composite primary key (to handle multi-tenancy).
Let's take simple and classical example. I have two entities Project
and Person
which have a many-to-many relationship:
public class Person
{
[Key, Column(Order = 1),]
public Int32 Id { get; set; }
[Key, Column(Order = 2)]
public int TenantId { get; set; }
public string Name { get; set; }
}
public class Project
{
[Key, Column(Order = 1),]
public Int32 Id { get; set; }
[Key, Column(Order = 2)]
public int TenantId { get; set; }
Public string Name { get; set; }
}
I also have a joining table ProjectPerson
like this:
Above I have defined a Project
to ProjectPerson
relationship. Note that public class ProjectPerson
{
[Key, Column(Order = 1),]
public Int32 Id { get; set; }
[Key, Column(Order = 2)]
[ForeignKey("Project")]
public int TenantId { get; set; }
[ForeignKey("Project")]
public int ProjectId { get; set; }
public DateTime AddedDate{ get; set; }
public virtual Project Project { get; set; }
}
TenantId
is used as a part of the primary and foreign key.
Up to this point, the model works as expected. But the Person
to ProjectPerson
relationship is missing.
I have added following two lines to the ProjectPerson
class
[ForeignKey("Person")]
public int PersonId { get; set; }
public virtual Person Person { get; set; }
Definitely mapping to TenantId
is missing. I don't know how to define it
Update
I found this. but still im not satisfied as there is additional TenantId ( PersonTenantId
) as a foreign key.
public class ProjectPerson
{
[Key, Column(Order = 1),]
public Int32 Id { get; set; }
[Key, Column(Order = 2)]
[ForeignKey("Project")]
public int TenantId { get; set; }
[ForeignKey("Project")]
public int ProjectId { get; set; }
[ForeignKey("Person")]
public int PersonId { get; set; }
[ForeignKey("Person")]
public int PersonTenantId { get; set; } // duplicate
public DateTime AddedDate{ get; set; }
public virtual Project Project { get; set; }
public virtual Person Person { get; set; }
}