当使用相同实体的2个属性时,EF6 Code First混淆

时间:2015-01-20 14:20:40

标签: c# asp.net-mvc ef-code-first entity-framework-6 ef-migrations

我使用Code First方法创建我的数据库,这种方法到目前为止工作得很好。但是我有一个小问题,EF6似乎无法理解,或者我做错了。

我的课程Project有一个CreatedBy类型的属性PersonMembers类型的另一个属性ICollection<Person>;

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

在课程Person中,我添加了以下属性:

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

告诉EF6两个类之间应该存在多对多关系。

如果我在Add-Migration类中注释Update-Database的Visual Studio中运行CreatedByProject,那么会发生Project <-> Person表将在数据库中创建。

如果我取消注释CreatedBy属性并再次运行相同的脚本,Project <-> Person表将被删除,ProjectPerson表将获得一个包含ForeignKey的新列在两者之间将其改为一对一的关系。

我如何使用Code First在我的ProjectPerson类之间建立关系,这样我就可以知道1对多(1个人可以创建多个项目)和多对多(很多人可以添加到很多项目中)?

2 个答案:

答案 0 :(得分:3)

您需要为配置实体使用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

答案 1 :(得分:0)

我还没有对此进行验证,但是如果您为Created by指定了明确的外键,则应该足以区分这两种不同的关系:

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