有几个问题,但没有一个对我有太多帮助,所以我决定问自己。
我想首先使用Entity Framework代码来创建一个奇怪的关系。我有三个实体(Qualification
,Test
和Procedure
),它们都可以选择拥有文档。我试图将所有文档存储在一个表中。如何配置所有这些实体之间的关系。
Qualification
有一对一的可选Document
Test
有一对一的可选Document
Procedure
有一对多可选Documents
Document
与Qualification
,Test
或Procedure
之间存在必需的关系。
public class Assessment
{
public int AssessmentId { get; set; }
//Other properties in Assessment
public Document Document { get; set; }
}
public class Qualification
{
public int QualificationId{ get; set; }
//Other properties in Qualification
public Document Document { get; set; }
}
public class Procedure
{
public int ProcedureId { get; set; }
//Other properties in Procedure
public ICollection<Document> Documents { get; set; }
}
public class Document
{
public int DocumentId { get; set; }
//Other properties in Document
public Qualification Qualification { get; set; }
public Assessment Assessment { get; set; }
public Procedure Procedure { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Not sure what goes here, but this was not working
modelBuilder.Entity<Document>()
.HasOptional(d => d.Qualification).WithOptionalPrincipal(q => q.Document);
modelBuilder.Entity<Document>()
.HasOptional(d => d.Asssessment).WithOptionalPrincipal(q => q.Document);
}
添加迁移时出现错误:
无法确定类型之间关联的主要结束。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。
我不知道该怎么做。我在DocumentId
和Assessment
中有一个可以为空的Qualification
,但是这不起作用b / c Procedure
可以保存一个集合,因此Document
必须包含Id。 Document
是否为每个可能的父级保留了可空的ID?请帮助。
答案 0 :(得分:1)
在你的映射中,你将Document
设置为主体,但实际上它是依赖的。所以你应该将你的映射改为:
modelBuilder.Entity<Document>()
.HasRequired(d => d.Qualification)
.WithOptionalDependent(q => q.Document);
modelBuilder.Entity<Document>()
.HasRequired(d => d.Asssessment)
.WithOptionalDependent(q => q.Document);