我有一个带有TypeId列的BaseTable,它是Type表的外键。我通过使用每个层次结构模式的模板将其映射到实体框架模型。
现在我有一个BaseClass
和两个名为SubClass1
和SubClass2
的子类,并生成BaseClass abstract
。
从我的一个页面到第二个页面,我得到一个id(当然是BaseClass
的id),我想从数据库中获取此对象。
我将如何进行查询?即将到来的ID当然属于子类。
例如,我可以这样写:
BaseClass object = provider.getfrombaseclassbyid(id);
我可以像这样打拳吗?如果可以的话,我怎么知道对象是什么呢。这是Subclass1
还是Subclass2
?我怎么知道呢?
你能帮我解决一下吗?
答案 0 :(得分:0)
我不确定以下是否回答了您的问题,但您确实可以查询一个代表抽象实体的集合:
BaseClass entity = context.BaseClasses.SingleOrDefault(b => b.Id == id);
当然结果永远不会是BaseClass
类型,因为不能创建抽象类型的实例。如果具有SubClass1
的实体不存在,它将是SubClass2
或null
(或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
。