访问映射实体中使用的属性到EFv4中的表

时间:2011-02-13 16:07:24

标签: entity-framework entity-framework-4

当我们在EFv4 EDM图中有两个实体并且数据库中只有一个表(例如,具有表文档和实体Invoice和Qoute)时,具有documentTypeId列的表文档作为鉴别器并将此列设置为鉴别器在EDM中(在表映射中),我们如何在代码中读取此属性的值?

我们不能为它赋值,因为EF为我们做了它(根据我们在表格映射条件中输入的内容),但不知何故我不明白为什么我们也不允许阅读它。

2 个答案:

答案 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类。 InvoiceQuote会扩展此类,但会指定某些DocumentTypeId过滤器。但是,由于原始类具有DocumentTypeId列,因此每个列都会包含该列。

此方法的另一个优点是您可以创建可以对任何Document起作用的实用程序方法,并且可以将任何InvoiceQuote传递给这些方法。