EF4 Проблемы наследования при использовании таблицы на тип - PullRequest
2 голосов
/ 11 октября 2010

У меня немало проблем с попыткой заставить наследство работать в EF4.Исходная модель довольно большая, однако мне удалось воспроизвести ее в модели, состоящей из двух объектов.

По сути, две таблицы - «Актив» и «Анкета».Анкета наследует Актив (т.е. Анкета является Активом).Они делают это с помощью Анкеты, имеющей AssetID, связывающий обратно с Активом.Технически дизайн может быть не самым лучшим, однако я пытаюсь сделать эту работу для 10-летней базы данных без каких-либо серьезных изменений ...

Итак, таблицы:

Актив

  • Уникальный идентификатор объекта AssetID NOT NULL - первичный ключ этой таблицы
  • Другие нерелевантные столбцы

Content_Questionnaire

  • Id uniqueidentifier NOT NULL - первичный ключ этой таблицы
  • AssetID uniqueidentifier NOT NULL - внешний ключ для Asset.AssetID
  • Другие нерелевантные столбцы

Модель для этого чрезвычайно проста - по сути это:

alt text

Файл EDMX для этого:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
    <Schema Namespace="SnapServerModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
        <EntityContainer Name="SnapServerModelStoreContainer">
          <EntitySet Name="Asset" EntityType="SnapServerModel.Store.Asset" store:Type="Tables" Schema="dbo" />
          <EntitySet Name="Content_Questionnaire" EntityType="SnapServerModel.Store.Content_Questionnaire" store:Type="Tables" Schema="dbo" />
          <AssociationSet Name="FK_Content_Questionnaire_Asset" Association="SnapServerModel.Store.FK_Content_Questionnaire_Asset">
            <End Role="Asset" EntitySet="Asset" />
            <End Role="Content_Questionnaire" EntitySet="Content_Questionnaire" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Asset">
          <Key>
            <PropertyRef Name="AssetID" />
          </Key>
          <Property Name="AssetID" Type="uniqueidentifier" Nullable="false" />
        </EntityType>
        <EntityType Name="Content_Questionnaire">
          <Key>
            <PropertyRef Name="Id" />
          </Key>
          <Property Name="Id" Type="uniqueidentifier" Nullable="false" />
          <Property Name="AssetID" Type="uniqueidentifier" Nullable="false" />
        </EntityType>
        <Association Name="FK_Content_Questionnaire_Asset">
          <End Role="Asset" Type="SnapServerModel.Store.Asset" Multiplicity="1" />
          <End Role="Content_Questionnaire" Type="SnapServerModel.Store.Content_Questionnaire" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Asset">
              <PropertyRef Name="AssetID" />
            </Principal>
            <Dependent Role="Content_Questionnaire">
              <PropertyRef Name="AssetID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </Schema></edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="SnapServerModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
        <EntityContainer Name="SnapServerEntities" annotation:LazyLoadingEnabled="true">
          <EntitySet Name="Assets" EntityType="SnapServerModel.Asset" />
          <AssociationSet Name="FK_Content_Questionnaire_Asset" Association="SnapServerModel.FK_Content_Questionnaire_Asset">
            <End Role="Asset" EntitySet="Assets" />
            <End Role="Content_Questionnaire" EntitySet="Assets" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Asset">
          <Key>
            <PropertyRef Name="AssetID" />
          </Key>
          <Property Type="Guid" Name="AssetID" Nullable="false" />
          <NavigationProperty Name="Content_Questionnaire" Relationship="SnapServerModel.FK_Content_Questionnaire_Asset" FromRole="Asset" ToRole="Content_Questionnaire" />
        </EntityType>
        <EntityType Name="Content_Questionnaire" BaseType="SnapServerModel.Asset">
          <Property Type="Guid" Name="Id" Nullable="false" />
          <NavigationProperty Name="Asset" Relationship="SnapServerModel.FK_Content_Questionnaire_Asset" FromRole="Content_Questionnaire" ToRole="Asset" />
        </EntityType>
        <Association Name="FK_Content_Questionnaire_Asset">
          <End Type="SnapServerModel.Asset" Role="Asset" Multiplicity="1" />
          <End Type="SnapServerModel.Content_Questionnaire" Role="Content_Questionnaire" Multiplicity="1" />
          <ReferentialConstraint>
            <Principal Role="Asset">
              <PropertyRef Name="AssetID" />
            </Principal>
            <Dependent Role="Content_Questionnaire">
              <PropertyRef Name="AssetID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </Schema>
    </edmx:ConceptualModels>
    <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="SnapServerModelStoreContainer" CdmEntityContainer="SnapServerEntities">
          <EntitySetMapping Name="Assets">
            <EntityTypeMapping TypeName="IsTypeOf(SnapServerModel.Asset)">
              <MappingFragment StoreEntitySet="Asset">
                <ScalarProperty Name="AssetID" ColumnName="AssetID" />
                </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="IsTypeOf(SnapServerModel.Content_Questionnaire)">
              <MappingFragment StoreEntitySet="Content_Questionnaire">
                <ScalarProperty Name="Id" ColumnName="Id" />
                <ScalarProperty Name="AssetID" ColumnName="AssetID" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
    <Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
      </DesignerInfoPropertySet>
    </Connection>
    <Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true" />
        <DesignerProperty Name="EnablePluralization" Value="True" />
        <DesignerProperty Name="IncludeForeignKeysInModel" Value="True" />
      </DesignerInfoPropertySet>
    </Options>
    <!-- Diagram content (shape and connector positions) -->
    <Diagrams>
      <Diagram Name="Model1">
        <EntityTypeShape EntityType="SnapServerModel.Asset" Width="1.5" PointX="0.75" PointY="2.125" Height="1.4033821614583335" />
        <EntityTypeShape EntityType="SnapServerModel.Content_Questionnaire" Width="1.5" PointX="3" PointY="2.125" Height="1.4033821614583339" />
        <AssociationConnector Association="SnapServerModel.FK_Content_Questionnaire_Asset" >
          <ConnectorPoint PointX="2.25" PointY="2.4133455403645834" />
          <ConnectorPoint PointX="3" PointY="2.4133455403645834" />
        </AssociationConnector>
        <InheritanceConnector EntityType="SnapServerModel.Content_Questionnaire" ManuallyRouted="false" >
          <ConnectorPoint PointX="2.25" PointY="2.8266910807291667" />
          <ConnectorPoint PointX="3" PointY="2.8266910807291667" />
        </InheritanceConnector>
      </Diagram>
    </Diagrams>
  </Designer>
</edmx:Edmx>

Теперь моя проблема в том, что независимо от того, что я пробовал - я получаю два сообщения об ошибках:

  1. Ошибка 1 Ошибка 3002. Проблема при отображении фрагментов, начиная со строки 87: Потенциальное нарушение времени выполнения таблицы Content_Questionnaireключи (Content_Questionnaire.Id): столбцы (Content_Questionnaire.Id) сопоставляются со свойствами EntitySet Assets (Assets.Id) на концептуальной стороне, но они не формируют ключевые свойства EntitySet (Assets.AssetID).
  2. Ошибка 2 Ошибка 3003. Проблема при отображении фрагментов, начиная со строки 87: Все ключевые свойства (Assets.AssetID) активов EntitySet должны быть сопоставлены со всеми ключевыми свойствами (Content_Questionnaire.Id) таблицы Content_Questionnaire.

Как же мне избавиться от этих ошибок?

Возможно, что-то совершенно очевидно, что я пропускаю - однако ЛЮБАЯ помощь или даже толчокв правильном направлении будет принята с благодарностью.Я получил несколько седых волос, пытаясь справиться с этим сегодня!

Заранее спасибо за любую помощь, которую вы можете пролить.

1 Ответ

2 голосов
/ 11 октября 2010

Хорошо, есть несколько вещей, которые вам нужно исправить в вашей модели:

1. Во-первых, вам нужно изменить первичный ключ в вашей таблице Content_Questionnaire на AssetID, насколько мне известно, EF поддерживает наследование между двумя сущностями, только если связь на первичных ключах на обоих концах. Так должно выглядеть так:

<EntityType Name="Content_Questionnaire">
    <Key>
        <!--First Change:-->
        <PropertyRef Name="AssetID" />
    </Key>
    <Property Name="Id" Type="uniqueidentifier" Nullable="false" />
    <Property Name="AssetID" Type="uniqueidentifier" Nullable="false" />
</EntityType>

2.Множественность в производной сущности должна быть 0..1 (сейчас это *)

<Association Name="FK_Content_Questionnaire_Asset">
  <End Role="Asset" Type="SnapServerModel.Store.Asset" Multiplicity="1" />
  <!--Secound Change:-->
  <End Role="Content_Questionnaire" 
Type="SnapServerModel.Store.Content_Questionnaire" Multiplicity="0..1" />
  <ReferentialConstraint>
    <Principal Role="Asset">
      <PropertyRef Name="AssetID" />
    </Principal>
    <Dependent Role="Content_Questionnaire">
      <PropertyRef Name="AssetID" />
    </Dependent>
  </ReferentialConstraint>
</Association>

3.Кроме того, на поверхности вашей модели просто выберите линию связи между двумя сущностями и удалите ее (ваши свойства навигации исчезнут), имея наследование, вам это не нужно.

Теперь попробуйте собрать свой проект снова, и вы увидите, что ошибки компиляции исчезли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...