【问题标题】:Do I have to implement key twice for EF code first with inheritance我是否必须首先通过继承为 EF 代码实现密钥两次
【发布时间】:2011-11-18 12:06:15
【问题描述】:

我有一个抽象超类 DataContent:

public abstract class DataContent
{
    [Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [ForeignKey("Sheet")] //Foreign Key van Sheet
    public int SheetId { get; set; }
    public string Name { get; set; }

    public DataContent(int i, string n)
    {
        Id = i;
        Name = n;
    }

和 3 个子类,例如 EmptyContent:

public class EmptyContent: DataContent
{

    //TODO: Do these keys have to be here as well???
    [Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [ForeignKey("Sheet")] //Foreign Key van Sheet
    public int SheetId { get; set; }

    public string Name { get; set; }
    public string Text { get; set; }


    public EmptyContent (int i, string n) : base(i,n)
    {
        Text = "";

    }

}

我的问题是:我是否必须为实体框架声明(外)键两次才能生成数据库?还是我可以只将它们放在超类 Datacontent 中?

[如果你觉得这个问题很愚蠢,我还是个学生很抱歉:)]

【问题讨论】:

    标签: c# entity-framework-4.1 ef-code-first data-annotations subclass


    【解决方案1】:

    每个属性只能实现一次(名称在整个层次结构中必须是唯一的)。您的派生类不应具有基类的任何属性,除非它们覆盖它们。

    【讨论】:

    • 所以我可以在子类中删除它们,它们将被继承,实体框架将识别这些并为数据库中的每个子类创建单独的表?
    • 整个继承概念的一个主要目的是您不必多次定义“共享”属性。我很确定 EF 可以解决这个问题。试试看吧。
    • 您必须用Table属性标记每个类并指定表名以使用TPT继承,否则EF将使用TPH继承并且所有实体将映射到单个表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多