简体   繁体   中英

EF Code First - How to add foreign key property when using InverseProperty?

I have the code first model defined below.

There are two relationships between Project and TeamMember:

  1. many-to-many - TeamMember can work on many projects. Project can have many TeamMembers.
  2. one-to-many - Project always has one TeamMember as Manager.

     public class Project { public Guid ProjectId { get; set; } [InverseProperty("ManagedProjects"), Required] public virtual TeamMember Manager { get; set; } // 2 public virtual List<TeamMember> TeamMembers { get; set; } // 1 } public class TeamMember { public Guid TeamMemberId { get; set; } public virtual List<Project> Projects { get; set; } // 1 [InverseProperty("Manager")] public virtual List<Project> ManagedProjects { get; set; } // 2 } 

This model generates the Project table definition shown below.

CREATE TABLE [dbo].[Project] (
  [ProjectId]            UNIQUEIDENTIFIER NOT NULL,
  [Manager_TeamMemberId] UNIQUEIDENTIFIER NOT NULL,
  CONSTRAINT [PK_dbo.Project] PRIMARY KEY CLUSTERED ([ProjectId] ASC),
  CONSTRAINT [FK_dbo.Project_dbo.TeamMember_Manager_TeamMemberId] FOREIGN KEY
    ([Manager_TeamMemberId]) REFERENCES [dbo].[TeamMember] ([TeamMemberId]));

I need to extend Project with a foreign key property for Manager but can not figure out to do this.

public Guid ManagerId { get; set; } // 2
[InverseProperty("ManagedProjects")]
public virtual TeamMember Manager { get; set; } // 2

The above code does not work as it just generates a ManagerId field in the Project table. I Have tried different combinations of ForeignKey og InverseProperty without any luck.

Any suggestions?

Next code should create join table for many-to-many and 'Project' table will have foreign key on this table.

public class Project
{
    public Guid ProjectId { get; set; }

    public virtual TeamMember Manager { get; set; } // 2

    [InverseProperty("Projects")]
    public virtual List<TeamMember> TeamMembers { get; set; } // 1
}

public class TeamMember
{
    public Guid TeamMemberId { get; set; }

    [InverseProperty("TeamMembers")]
    public virtual List<Project> Projects { get; set; } // 1

    [InverseProperty("Manager")]
    public virtual List<Project> ManagedProjects { get; set; } // 2
}

I think that impossible have many-to-many relationship without join table.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM