2010-10-11 24 views
2

我在嘗試讓繼承在EF4中工作時遇到了相當多的麻煩。原始模型非常大,但是我已經設法將它複製到只有兩個實體的模型中。EF4按類型使用表的繼承問題

基本上這兩個表是「資產」和「問卷」。調查問卷繼承資產(即問卷是資產)。他們通過問卷調查將資產ID鏈接回資產。技術上的設計可能不是最好的,但是我正在努力使這項工作對於一個10歲的數據庫沒有任何重大的重新設計...

所以鑑於此,該表是:

資產

  • 由assetid唯一標識符NOT NULL - 此表的主鍵
  • 其他無關列

Content_Questionnaire

  • 標識的唯一標識符NOT NULL - 此表的主鍵
  • 由assetid唯一標識符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行開始的映射片段中的問題:EntitySet資產的所有關鍵屬性(Assets.AssetID)都必須映射到表Content_Questionnaire的所有關鍵屬性(Content_Questionnaire.Id)。

我究竟如何擺脫這些錯誤?

這可能是完全顯而易見的東西,我很想念 - 然而任何幫助或甚至在正確的方向微調將不勝感激。今天我已經收到了一些灰頭髮試圖通過這個工作!

在此先感謝您提供的任何幫助。

+0

爲什麼你有一對一的關係? – 2010-10-11 04:15:40

+0

謝謝 - 這是以下解決方案中的問題之一:應該沒有指定那種關係。不幸的是,設計師投入了它 - 它需要一點核心理解才能修復設計師看起來的東西! – 2010-10-11 15:26:06

回答

2

好了,還有,你需要在你的模型來解決幾件事情:

1.首先,你需要改變你的Content_Questionnaire表的主鍵是由assetid,因爲據我所知,EF僅當關聯在兩端的主鍵上時才支持2實體之間的繼承。因此,它應該是這個樣子:

<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.Also,你的模型表面,只需選擇兩個實體之間的關聯線並將其刪除(您的導航屬性將消失),通過繼承,您不需要它。

現在,嘗試再次構建您的項目,您將看到編譯錯誤消失。

+0

你是一個傳奇 - 謝謝你。現在解釋它是有意義的! – 2010-10-11 15:20:39

+0

大聲笑,當然我不是,但它非常討人喜歡,謝謝! – 2010-10-11 21:27:32