2009-12-09 82 views
1

我试图在实体框架(VS 2008 SP1,3.5)中执行Table Per Hierarchy模型。具有多个抽象继承的实体框架TPH

我的大多数模型都非常简单,它是一个抽象类型,它具有多个继承自它的子类型。

但是,我一直在为这个最新的挑战而苦苦挣扎。我有学生想继承人(抽象),应该从派生(抽象)继承。

每次我这样做,我得到一个“错误2078:EntityType'Model.PERSONS'是抽象的,只能使用IsTypeOf映射。”我想问题是PARTIES已经在实体集中定义为IsTypeOf。

那么这甚至可能吗?我可以通过使PERSONS abstract = false并分配一个假条件映射来解决它。但这似乎是一个愚蠢的解决方法。

+0

跟进的问题在这里: http://stackoverflow.com/questions/2045924/multiple-inheritance-with-entity-framework-with-tph – itchi 2010-01-12 00:25:26

回答

2

使用XML Editor编辑模型:找到映射并将IsTypeOf添加到相应的EntityTypeMapping标记。
下面是一个例子类似的情况:
SQL Server的DDL:

CREATE TABLE [dbo].[Student] (
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [PartyInfo] [varchar](max) NOT NULL, 
    [PersonInfo] [varchar](max) NOT NULL, 
    [StudInfo] [varchar](max) NOT NULL, 
    CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ( [Id] ASC ) 
)

EDMX:

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="1.0" 
xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx"> 
<!-- EF Runtime content --> 
<edmx:Runtime> 
<!-- SSDL content --> 
<edmx:StorageModels> 
    <Schema Namespace="test_1Model.Store" Alias="Self" 
Provider="System.Data.SqlClient" ProviderManifestToken="2005" 
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" 
xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"> 
    <EntityContainer Name="test_1ModelStoreContainer"> 
     <EntitySet Name="Student" EntityType="test_1Model.Store.Student" 
store:Type="Tables" Schema="dbo" /> 
    </EntityContainer> 
    <EntityType Name="Student"> 
     <Key> 
     <PropertyRef Name="Id" /> 
     </Key> 
     <Property Name="Id" Type="int" Nullable="false" 
StoreGeneratedPattern="Identity" /> 
     <Property Name="PartyInfo" Type="varchar(max)" Nullable="false" /> 
     <Property Name="PersonInfo" Type="varchar(max)" Nullable="false" /> 
     <Property Name="StudInfo" Type="varchar(max)" Nullable="false" /> 
    </EntityType> 
    </Schema> 
</edmx:StorageModels> 
<!-- CSDL content --> 
<edmx:ConceptualModels> 
    <Schema Namespace="test_1Model" Alias="Self" 
xmlns="http://schemas.microsoft.com/ado/2006/04/edm"> 
    <EntityContainer Name="test_Entities"> 
     <EntitySet Name="PartySet" EntityType="test_1Model.Party" /> 
    </EntityContainer> 
    <EntityType Name="Party" Abstract="true"> 
     <Key> 
     <PropertyRef Name="Id" /> 
     </Key> 
     <Property Name="Id" Type="Int32" Nullable="false" /> 
     <Property Name="PartyInfo" Type="String" Nullable="false" 
MaxLength="Max" Unicode="false" FixedLength="false" /> 
    </EntityType> 
    <EntityType Name="Person" BaseType="test_1Model.Party" Abstract="true" > 
     <Property Name="PersonInfo" Type="String" Nullable="false" /> 
    </EntityType> 
    <EntityType Name="Student" BaseType="test_1Model.Person" > 
     <Property Name="StudInfo" Type="String" Nullable="false" /> 
    </EntityType> 
    </Schema> 
</edmx:ConceptualModels> 
<!-- C-S mapping content --> 
<edmx:Mappings> 
    <Mapping Space="C-S" 
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS"> 
    <EntityContainerMapping 
StorageEntityContainer="test_1ModelStoreContainer" 
CdmEntityContainer="test_Entities"> 
     <EntitySetMapping Name="PartySet"> 
     <EntityTypeMapping TypeName="IsTypeOf(test_1Model.Party)"> 
      <MappingFragment StoreEntitySet="Student"> 
      <ScalarProperty Name="PartyInfo" ColumnName="PartyInfo" /> 
      <ScalarProperty Name="Id" ColumnName="Id" /> 
      </MappingFragment> 
     </EntityTypeMapping> 
     <EntityTypeMapping TypeName="IsTypeOf(test_1Model.Person)"> 
      <MappingFragment StoreEntitySet="Student"> 
      <ScalarProperty Name="Id" ColumnName="Id" /> 
      <ScalarProperty Name="PersonInfo" ColumnName="PersonInfo" /> 
      </MappingFragment> 
     </EntityTypeMapping> 
     <EntityTypeMapping TypeName="test_1Model.Student"> 
      <MappingFragment StoreEntitySet="Student"> 
      <ScalarProperty Name="PartyInfo" ColumnName="PartyInfo" /> 
      <ScalarProperty Name="PersonInfo" ColumnName="PersonInfo" /> 
      <ScalarProperty Name="Id" ColumnName="Id" /> 
      <ScalarProperty Name="StudInfo" ColumnName="StudInfo" /> 
      </MappingFragment> 
     </EntityTypeMapping> 
    </EntitySetMapping> 
    </EntityContainerMapping> 
</Mapping> 
</edmx:Mappings> 
</edmx:Runtime> 
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) --> 
<edmx:Designer xmlns="http://schemas.microsoft.com/ado/2007/06/edmx"> 
    <edmx:Connection> 
     <DesignerInfoPropertySet> 
     <DesignerProperty Name="MetadataArtifactProcessing" 
Value="EmbedInOutputAssembly" /> 
     </DesignerInfoPropertySet> 
    </edmx:Connection> 
    <edmx:Options> 
    <DesignerInfoPropertySet> 
     <DesignerProperty Name="ValidateOnBuild" Value="true" /> 
    </DesignerInfoPropertySet> 
    </edmx:Options> 
    <!-- Diagram content (shape and connector positions) --> 
    <edmx:Diagrams> 
    <Diagram Name="SqlServer_Model" /> 
    </edmx:Diagrams> 
</edmx:Designer> 
</edmx:Edmx> 
+0

所以我似乎必须在“CS”映射空间中创建所有实体TypeOf(如果它们是抽象的)。任何非抽象的实体都不需要编辑。你的例子帮助了,谢谢你的回答,并为延迟感到抱歉(节假日,我想确保我做对了) – itchi 2009-12-18 23:43:32