EF6 Code First 混淆使用同一实体的 2 个属性

EF6 Code First confusion when having 2 properties using the same entity

我正在使用 Code First 方法创建我的数据库,该方法目前运行良好。但是我有一个小问题,EF6 似乎无法理解或者我做错了。

我有 class Project 有一个 属性 CreatedBy 类型 Person 和另一个 属性 Members输入 ICollection<Person>;

public class Project
{
    // ...
    public Person CreatedBy { get; set; }
    public virtual ICollection<Person> Members { get; set; }
}

在classPerson中我添加了以下内容属性:

public virtual ICollection<Project> Projects { get; set; }

告诉 EF6 2 classes 之间应该存在多对多关系。

如果我运行一个Add-MigrationUpdate-Database在Visual Studio中用CreatedByProject中注释掉class , 将会发生的是在数据库中创建一个 Project <-> Person table.

如果我再次取消对 CreatedBy 属性 和 运行 相同脚本的注释,Project <-> Person table 将被删除并且 ProjectPerson tables 得到一个新列,两者之间有一个外键,将其更改为一对一关系。

我如何使用 Code First 在我的 ProjectPerson class 之间建立关系,这样我就可以如何使一对多(1 人可以创建许多项目)和多对多(可以将许多人添加到许多项目)?

我还没有验证这一点,但是如果您为创建者指定明确的外键,应该足以区分这两种不同的关系:

// make nullable if CreatedBy is not required
[ForeignKey("CreatedBy")]
public int CreatedById { get; set; }
public Person CreatedBy { get; set; }

您需要使用 Fluent API 配置实体:

    class ProjectConfiguration : EntityTypeConfiguration<Project>
    {
        public ProjectConfiguration()
        {
            HasRequired(e => e.CreatedBy).WithMany(); // one-to-many
            HasMany(e => e.Members).WithMany(); //many-to-many
        }
    }

    public class Context : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new ProjectConfiguration());
        }
    }

关于 Fluent 的更多详细信息 API:http://msdn.microsoft.com/en-us/data/jj591617.aspx

配置与 Fluent 的关系 API:http://msdn.microsoft.com/en-us/data/jj591620