1

我在如何为实体类中的继承关系生成数据库时遇到问题。它正确地使子类表中的主键 ID 引用超类表中的 ID - 但它也在超类表中创建了一个不需要的外键。这是我的课程:

抽象超类:

public abstract class DaqObject
{
    public int ID { get; set; }
    public int AgencyID { get; set; }
    public int DaqObjectTypeID { get; set; }

    [ForeignKey("AgencyID")]
    public virtual Agency Agency { get; set; }
    [ForeignKey("DaqObjectTypeID")]
    public virtual DaqObjectType DaqObjectType { get; set; }

    public virtual Document InheritingDocument { get; set; }
}

对应的数据库表有以下列:

  • ID(PK,int,不为空)
  • AgencyID (FK, int, not null)
  • DaqObjectTypeID (FK, int, not null)
  • InheritingWell_ID (FK, int, null)

子类:

public class Document : DaqObject
{
    public string Name { get; set; }
}

使用具有以下列的相应数据库表:

  • ID(PK、FK、int,不为空)
  • 名称 (nvarchar(max), null)

(这些类已被精简为示例。)

数据库中的 DaqObject 表以 InheritingDocument_ID 列结束。我可以自己创建数据库并在超类表中没有该外键的情况下建立关系。是否可以让 EF 代码先做同样的事情?

4

2 回答 2

2

InheritingDocument中的告诉EF 在和实体DaqObject之间创建一对多关系。这就是为什么您的数据库中有该列的原因。DocumentDaqObjectInheritingDocument_ID

我想,这不是你想要的,你已经添加了InheritingDocument属性来使继承工作,对吧?没有必要,EF 会自动处理继承处理。有一篇不错的博客文章,描述了使用 EF 处理继承类的可能策略。

于 2012-12-16T23:09:09.883 回答
0

InheritingDocumentID 是为属性生成的字段

public virtual Document InheritingDocument { get; set; }

该关系由 EF 默认创建。

目前尚不清楚,但是什么是InheritingWell_ID (FK, int, null)字段,我认为您发布的代码缺少某些内容。

您可以将[NotMapped]属性添加到 InheritingDocument 属性以避免为其生成字段,但要使其正常工作,您还需要将 DbSet 添加到 db 上下文中,这将为每个层次结构提供五个表(一个表用于层次结构中的所有类型),速度更快但它不在 3NF 中。

于 2012-12-17T06:29:03.127 回答