实体框架TPT继承 - 如何从数据库获取?

时间:2012-07-21 12:34:15

标签: entity-framework

我有一个带有TypeId列的BaseTable,它是Type表的外键。我通过使用每个层次结构模式的模板将其映射到实体框架模型。

现在我有一个BaseClass和两个名为SubClass1SubClass2的子类,并生成BaseClass abstract

从我的一个页面到第二个页面,我得到一个id(当然是BaseClass的id),我想从数据库中获取此对象。

我将如何进行查询?即将到来的ID当然属于子类。

例如,我可以这样写:

BaseClass object = provider.getfrombaseclassbyid(id);

我可以像这样打拳吗?如果可以的话,我怎么知道对象是什么呢。这是Subclass1还是Subclass2?我怎么知道呢?

你能帮我解决一下吗?

1 个答案:

答案 0 :(得分:0)

我不确定以下是否回答了您的问题,但您确实可以查询一个代表抽象实体的集合:

BaseClass entity = context.BaseClasses.SingleOrDefault(b => b.Id == id);

当然结果永远不会是BaseClass类型,因为不能创建抽象类型的实例。如果具有SubClass1的实体不存在,它将是SubClass2null(或id类型。实体框架可以通过查看鉴别器列的值(对于Table-Per-Hierarchy(TPH)inhericance)或通过从基表连接到派生表来决定在创建对象时必须使用哪种类型types(对于Table-Per-Type(TPT)继承)。

您可以使用以下方法检查物化类型:

string typeName = entity.GetType().Name; // will be "Subclass1" or "Subclass2"

或者:

if (entity is SubClass1)
    // ...
else if (entity is SubClass2)
    // ...

如果您事先知道要加载SubClass1类型的实体,则可以使用OfType<T>运算符:

SubClass1 entity = context.BaseClasses.OfType<SubClass1>()
    .SingleOrDefault(b => b.Id == id);

如果具有给定id的实体不是SubClass1而是SubClass2,则此查询的结果将为null。否则保证是SubClass1