代码首先在EF中使用具体基础和派生的具体类型进行TPC继承

时间:2011-07-18 12:20:12

标签: entity-framework entity-framework-4.1 ef-code-first

我正在尝试使用Code First设置TPC继承来模拟传入和传出的消息及其中的记录。 基本类型SentRecord是具体的,它的派生类型ReceivedRecord也是具体的,它继承自SentRecord并添加一些额外的字段以记录返回代码。像这样的东西,但有更多的属性:

public class SentRecord : RecordBase {
    public int Id { get; set; }
    public string FooField { get; set; }
}

public class ReceivedRecord : SentRecord {
    public int ReturnCode { get; set; }
    public SentRecord SentRecord { get; set; }
}

当前模型是TPH,因此表格得到一个描述符列,用于标识持久化对象的类型。它可以工作,但我更喜欢将两个对象存储在单独的表中,而不需要鉴别器列。表SentRecord只有列Id和FooField,表ReceivedRecord有Id,FooField,ReturnCode和FK到SentRecord。

我目前在DataContext类中有以下内容:

public class Context : DContext {
    public DbSet<SentRecord> SentRecords { get; set; }
    public DbSet<ReceivedRecord> ReceivedRecords { get; set; }
}

我对ReceivedRecord有以下配置:

public class ReceivedRecord_Configuration : EntityTypeConfiguration<ReceivedRecord>{
    public ReceivedRecord_Configuration() {
        this.Map(m => {
            m.MapInheritedProperties();
            m.ToTable("ReceivedRecords");
        });
    }
}

以下是SentRecord:

public class SentRecord_Configuration : EntityTypeConfiguration<SentRecord>{
    public SentRecord_Configuration() {
        this.Map(m => {
            m.MapInheritedProperties(); //In order to map the properties declared in RecordBase
            m.ToTable("SentRecords");
        });
    }
}

但是一旦我运行它,当EF试图初始化我的数据库时,我得到以下错误:

Problem in mapping fragments starting at lines 455, 1284:
An entity from one EntitySet is mapped to a row that is also mapped to an entity from another EntitySet with possibly different key.
Ensure these two mapping fragments do not map two unrelated EntitySets to two overlapping groups of rows.

我不知道该怎么做才能以我上面描述的TPC方式设置它?或者我应该坚持使用TPH吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

好的,我把它搞定了。说实话,我给出的例子比我正在使用的实际类和继承层次结构稍微复杂一点。该层次结构包含许多抽象类和其他类继承的具体类。

通过减少继承来“扁平化”层次结构使其顺利运行并且没有任何错误。响应消息不再从已发送的消息继承。

简短版本:在尝试使用代码优先的数据库模型时,不要使用混合具体和抽象基类型制作复杂的继承树。这只会让它更加复杂。