gpt4 book ai didi

c# - 使用 Table per Type 的 EF4 继承问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:43:56 26 4
gpt4 key购买 nike

我在尝试让继承在 EF4 中工作时遇到了很多麻烦。原始模型非常大,但我设法将其复制到只有两个实体的模型中。

本质上这两个表是“ Assets ”和“问卷”。 Questionnaire 继承 Asset(即 Questionnaire 是 Asset)。他们通过将 AssetID 链接回 Assets 的问卷调查来做到这一点。从技术上讲,设计可能不是最好的,但是我正在尝试在没有任何重大重新设计的情况下使它适用于已有 10 年历史的数据库...

鉴于此,表格是:

Assets

  • AssetID uniqueidentifier NOT NULL - 此表的主键
  • 其他不相关的栏目

内容_问卷

  • 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 行开始映射片段时出现问题:必须将 EntitySet Assets 的所有关键属性 (Assets.AssetID) 映射到表 Content_Questionnaire 的所有关键属性 (Content_Questionnaire.Id)。

我究竟该如何摆脱这些错误?

这可能是我遗漏的完全明显的东西 - 但是任何帮助或什至在正确方向上的插入将不胜感激。我一直在努力解决今天的问题!

在此先感谢您提供的任何帮助。

最佳答案

好的,您需要在模型中修复一些问题:

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.Derived实体的Multiplicity必须是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.此外,在您的模型表面上,只需选择两个实体之间的关联线并将其删除(您的导航属性将消失),通过继承,您不需要它。

现在,再次尝试构建您的项目,您会看到编译错误消失了。

关于c# - 使用 Table per Type 的 EF4 继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3903011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com