实体框架表与多个可选的一对一关系
问题描述:
有几个问题,但没有一个对我有太大的帮助,所以我决定问我自己。实体框架表与多个可选的一对一关系
我想先使用实体框架代码创建一个奇怪的关系。我有三个实体(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);
}
当增加一个移民,我得到一个错误:
Unable to determine the principal end of an association between the types. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.
我不知道如何做到这一点。我有一个可空的int DocumentId
在Assessment
和Qualification
但这不起作用b/c Procedure
可以容纳一个集合,所以Document
必须持有Id。 Document
是否为每个可能的家长保留可空的Id?请帮助。
答
在您的映射中,您将Document
设置为主体,但实际上它是依赖关系。所以你应该把你的映射改为:
modelBuilder.Entity<Document>()
.HasRequired(d => d.Qualification)
.WithOptionalDependent(q => q.Document);
modelBuilder.Entity<Document>()
.HasRequired(d => d.Asssessment)
.WithOptionalDependent(q => q.Document);
那么'HasRequired'是否意味着文档需要'Qualification'和'Assessment'? 'Procedure'和它的可选对象之一是否需要做任何事情? – JaredStroeb
它有助于EntityFramework定义主体端点。如果您依赖[约定](https://msdn.microsoft.com/en-us/data/jj679962.aspx),则通常不需要做任何事情来配置关系。但是您也可以将其配置为'modelBuilder.Entity().HasRequired(m => m.Procedure).WithMany(m => m.Documents);' –
在一般的One-to-One关系中,孩子是父母的外键。因为我正在使用一个数据库生成的整数作为导致'Document'中的主键冲突的父主键的主键?如果'资格''评估'是数据库中的第一个关键字为1,并且为两者添加“文档”会是一个问题? – JaredStroeb