EF继承/基类问题

Posted

技术标签:

【中文标题】EF继承/基类问题【英文标题】:EF inheritance / base class question 【发布时间】:2011-08-19 15:07:11 【问题描述】:

我正在使用实体框架和 ria 服务。我在映射和继承方面遇到问题。 我有一个包含 100 多列的(现有)表,称为 tblFacility,我已将其拉入 EF 设计器。我想使用尽可能少的带宽,并且在大多数情况下我只需要两列,一个 ID 和一个描述。所以我添加了另一个实体 Facility 并将其映射到 tblFacility 并映射了两列并将键设置为 ID。然后我将实体 tblFacility 的基类设置为 Facility。

我的错误是错误 3032:映射片段起始行时出现问题...。实体类型 dbModel.tblFacility、dbModel.Facility 正在映射到表 tblMembers 中的相同行。映射条件可用于区分这些类型映射到的行。

设计器的 Facility 有两个字段(一个键/ID,一个 Description),而 tblFacility 缺少我刚才提到的两列,看起来不错。 edmx 文件看起来像这样,我得到了错误

<EntitySetMapping Name="Facilities">
        <EntityTypeMapping TypeName="IsTypeOf(dbModel.Facility)">
          <MappingFragment StoreEntitySet="tblFacility">
            <ScalarProperty Name="Number" ColumnName="intFaclNbr" />
            <ScalarProperty Name="Name" ColumnName="vcFaclName" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs" TypeName="HSCAMasterModel.tblMember">
          <MappingFragment StoreEntitySet=" tblFacility">
            <ScalarProperty Name="Number" ColumnName="intFaclNbr" />                  <ScalarProperty Name="vcAddr1" ColumnName="vcAddr1" />
            <!--...over 100 more columns, name is not one of them...-->
       </MappingFragment>
        </EntityTypeMapping>
      </EntitySetMapping>

此时我的客户端只需要 Facility,不需要 tblFacility,但域服务确实需要 tblFacility 类。我想将此 Facility 基类用作 IQueryable 这是否有意义,或者我应该如何使用 EF? 谢谢!!

【问题讨论】:

【参考方案1】:

您不能为此使用继承。继承有严格的规定。根据这些规则,数据库中的每条记录只能由继承层次结构中的一种实体类型表示。因此,您不能使用继承来控制可以检索给定记录的多少列。

你需要投影。您可以尝试使用 QueryView 直接在 EDMX 中定义投影,也可以查看 this blog post 关于使用域服务的投影。

【讨论】:

以上是关于EF继承/基类问题的主要内容,如果未能解决你的问题,请参考以下文章

EF 4.2 和继承的类关联属性的几个问题

使用实体基类时的 EF CTP5 映射问题

EF 6 Codefirst - 使用流式 API 为基类中定义的属性设置默认值

EF增删查改基类

理解虚基类多重继承的问题

理解虚基类多重继承的问题