【问题标题】:Entity Framework table with multiple optional one to one relationships具有多个可选一对一关系的实体框架表
【发布时间】:2016-09-22 05:13:15
【问题描述】:

那里有几个问题,但没有一个对我有太大帮助,所以我决定问自己。

我想先使用实体​​框架代码来创建一个奇怪的关系。我有三个实体(QualificationTestProcedure),它们都可以选择拥有一个或多个文档。我正在尝试将所有文​​档存储在一张表中。如何配置所有这些实体之间的关系。

  • Qualification 有一对一可选 Document
  • Test 有一对一可选 Document
  • Procedure 有一对多可选 Documents

DocumentQualificationTestProcedure 之间存在必需的关系。

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 或数据注释显式配置。

我不知道该怎么做。我在AssessmentQualification 中有一个可为空的int DocumentId,但这不起作用b/c Procedure 可以保存一个集合,所以Document 必须保存ID。 Document 是否为每个可能的父母持有一个可为空的 ID?请帮忙。

【问题讨论】:

    标签: c# sql-server entity-framework


    【解决方案1】:

    在您的映射中,您将Document 设置为主体,但实际上它是依赖项。因此,您应该将映射更改为:

    modelBuilder.Entity<Document>()
        .HasRequired(d => d.Qualification)
        .WithOptionalDependent(q => q.Document);
    
    modelBuilder.Entity<Document>()
        .HasRequired(d => d.Asssessment)
        .WithOptionalDependent(q => q.Document);
    

    【讨论】:

    • 那里的HasRequired 不是意味着文档需要QualificationAssessment 吗? Procedure 及其可选的一对多不需要做任何事情吗?
    • 帮助EntityFramework定义主体端。通常,如果您依赖conventions,则无需执行任何操作来配置关系。但你也可以像modelBuilder.Entity&lt;Document&gt;().HasRequired(m =&gt; m.Procedure).WithMany(m =&gt; m.Documents); 一样配置它
    • 在一般的一对一关系中,子项的主键是父项的外键。由于我使用数据库生成的整数作为父级中的主键,会导致Document 中的主键冲突吗?如果 Qualification Assessment 是数据库中第一个键为 1 并且为两者都添加了 Document 的,这会是一个问题吗?
    • @JaredStroeb,是的,它会引起问题。父母的PK应该不同。因为,在这种情况下,如果添加 Document Id 其中为 1,它将同时属于 Qualification 和“评估”。在这种情况下,您必须将Document 设为主体,或者您必须以不重叠的方式生成 Id
    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2013-11-24
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多