当我们在EFv4 EDM图中有两个实体并且数据库中只有一个表(例如,具有表文档和实体Invoice和Qoute)时,具有documentTypeId列的表文档作为鉴别器并将此列设置为鉴别器在EDM中(在表映射中),我们如何在代码中读取此属性的值?
我们不能为它赋值,因为EF为我们做了它(根据我们在表格映射条件中输入的内容),但不知何故我不明白为什么我们也不允许阅读它。
答案 0 :(得分:2)
Imo此属性已经映射,因此您无法再次映射它。它用于确定物化实体的类型。你为什么需要这样的专栏。通常使用is
运算符就足够了:
var document = context.Documents.GetById(id);
if (document is Invoice)
{
...
}
如果您只需要选择子类型,可以使用OfType扩展方法,如:
var invoices = context.Documents.OfType<Invoice>().ToList();
添加新实体时也不需要设置此值,因为您要添加子类型 - 发票或报价。
修改强>
据我所知,您在查询中不需要此信息。在这种情况下,您不需要映射它。只需使用实体的部分类并添加将返回字符串的自定义属性。听起来像愚蠢的解决方案,但实际上它将是最简单的解决方案。
Discriminator列应该是映射元数据的一部分,因此在T4模板生成实体的情况下,可以更新模板,以便为您生成这样的属性。
答案 1 :(得分:0)
您可能希望使用单表继承层次结构,如here所述。
这样,您可以拥有一个包含Document
列的抽象DocumentTypeId
类。 Invoice
和Quote
会扩展此类,但会指定某些DocumentTypeId
过滤器。但是,由于原始类具有DocumentTypeId
列,因此每个列都会包含该列。
此方法的另一个优点是您可以创建可以对任何Document
起作用的实用程序方法,并且可以将任何Invoice
或Quote
传递给这些方法。