1

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

现在我有一个BaseClass和两个名为SubClass1andSubClass2和 make BaseClass的子类abstract

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

我将如何进行查询?Coming id 当然是属于一个子类的。

例如,我可以这样写:

BaseClass object = provider.getfrombaseclassbyid(id);

我可以做这样的拳击吗?如果可以,我怎么知道什么是真正的对象。它是一个Subclass1Subclass2?我怎么知道?

你能帮我怎么办吗?

4

1 回答 1

0

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

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

当然,结果永远不会是类型BaseClass,因为无法创建抽象类型的实例。它将是类型SubClass1SubClass2(或者null如果id不存在具有该类型的实体)。Entity Framework 可以通过查看鉴别器列的值(对于 Table-Per-Hierarchy (TPH) 继承)或通过从基表连接到派生表来决定在创建对象时必须使用哪种类型类型(用于 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不是 aSubClass1而是 a SubClass2,则此查询的结果将为null。否则,它保证是一个SubClass1.

于 2012-07-21T14:03:56.717 回答