Fluent API - 将ID标记为FK和PK

时间:2015-09-16 10:57:53

标签: c# entity-framework

我自己试图解决这个问题,但我不是一个数据库人,而且让我很困惑。

我有两节课(为便于阅读而减少)

public class Project : IModel
{
    //Internal DB Id
    [DataMember]
    public int ProjectID { get; set; }

    //Project No - Auto Generated at service level
    [DataMember]
    public string ProjectNo { get; set; }
}

public class ProjectExtra : IModel
{
    [DataMember]
    public int ProjectID { get; set; }
    [DataMember]
    public string Description { get; set; }
}

这些用于使用EF6生成我的数据库,但我需要将ProjectExtra中的ProjectID标记为PK和FK,我无法弄清楚如何使用Fluent API。

ProjectExtra是可选的,它可能对项目存在一次,或者根本不存在。

有人可能会指出我正确的方向,我已经在方法中设置了其他几个

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Project>().HasMany(p => p.Managers).WithMany();
        modelBuilder.Entity<Project>().HasMany(p => p.Clients).WithMany();

}

2 个答案:

答案 0 :(得分:1)

当我们使用流畅的API映射一对一关联时,我们不需要指定外键。由于EF仅支持主键上的一对一关联,因此它将自动在主键上的数据库中创建关系。

首先,您应该添加导航属性Project

public class ProjectExtra : IModel
{
    [DataMember]
    public int ProjectID { get; set; }
    [DataMember]
    public string Description { get; set; }

    // navigation property to Project
    [IgnoreDataMember]
    public virtual Project Project { get; set; } 
}

然后映射:

modelBuilder.Entity<ProjectExtra>().HasKey(t => t.ProjectID); 
modelBuilder.Entity<ProjectExtra>().HasRequired(p => p.Project).WithOptional();

参考:Associations in EF Code First

答案 1 :(得分:0)

您需要修改ProjectProjectExtra,以使它们互相引用:

    public class Project : IModel
    {
        //Internal DB Id
        [DataMember]
        public int ProjectID { get; set; }

        //Project No - Auto Generated at service level
        [DataMember]
        public string ProjectNo { get; set; }

        public ProjectExtra ProjectExtra { get; set; }
    }

    public class ProjectExtra : IModel
    {
        [DataMember]
        public int ProjectID { get; set; }
        [DataMember]
        public string Description { get; set; }

        public Project Project { get; set; }
    }

然后像这样更改OnModelCreating

    modelBuilder.Entity<ProjectExtra>().HasKey(p => p.ProjectID);
    modelBuilder.Entity<ProjectExtra>().HasRequired(p => p.Project)
                                       .WithOptional(p => p.ProjectExtra);