具有多个可选的一对一关系的实体框架表
本文关键字:一对一 关系 框架 实体 | 更新日期: 2023-09-27 18:08:06
有几个问题,但没有一个对我有很大帮助,所以我决定问我自己的问题。
我想使用实体框架代码首先创建一个奇怪的关系。我有三个实体(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或数据注释显式配置。
我不知道该怎么做。我在Assessment
和Qualification
中有一个可空的int DocumentId
,但这不起作用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);