我自己试图解决这个问题,但我不是一个数据库人,而且让我很困惑。
我有两节课(为便于阅读而减少)
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();
}
答案 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();
答案 1 :(得分:0)
您需要修改Project
和ProjectExtra
,以使它们互相引用:
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);