OK、この問題にはすべてがあります。
概念的には、多くの子リソースと多くの親リソースを持つことができる Resource エンティティがあります。Resource テーブルには ID と Name の 2 つのフィールドがあり、ID が主キーです。
多対多の関係を完成させるために、2 つのフィールド (Parent_ID、Child_ID) と、それぞれが Resource テーブル (ID) の主キーを参照する 2 つの外部キーを持つ ResourceHierarchy テーブルを作成しました。ResourceHierarchy テーブルには、次の複合主キーがあります。 (親_ID、子_ID)
各リソースが他のリソースの親または子として機能できることは既にわかっていますが、論理的にはすべてのリソースが親を持つわけではありませんが、それは重要ではありません。例として、リソース テーブルに次のリソースがあるとします。
ID Name
10000 Little House
10001 Font Door
10002 Roof
10003 Roof Tile
10004 Tile Monster
ResourceHierarchy テーブルには、次の関係があります。
Parent_ID Child_ID
10000 10001
10000 10002
10002 10003
10004 10003
次に、Entity Framework が Entity を生成します。
edmx ファイルで生成されたコードを確認すると、ResourceHierarchy テーブルがリレーションシップとして扱われており、ResourceHierarchy テーブルはエンティティとして扱われていないため、コードからアクセスできないことがわかります。
これが私が望んでいたすべてであれば、それは完全にうまくいくでしょう.
ただし、リソースエンティティ階層に数量列を追加したいときに問題が発生します。たとえば、小さな家には 1 つの正面玄関と 1 つの屋根しかありませんが、屋根とタイルのモンスター リソースには多くの屋根タイルがあります。
したがって、Quantity 列を Resource テーブルに追加すると、次のようになります。
ID Name Quantity
10000 Little House 1
10001 Font Door 1
10002 Roof 1
10003 Roof Tile 5
10004 Tile Monster 1
これにより、屋根とタイルのモンスターが 5 つの屋根タイルを共有しなければならないという問題が生じます。したがって、当然のことながら、数量列を ResourceHierarchy テーブルに追加しようとしますが、これを行って生成されたコードを更新するとすぐに、ResourceHierarchy テーブルが以前のように関係ではなくエンティティとして扱われます。リソース テーブルに戻るには、この非概念的な「エンティティ/リレーションシップ」を確認する必要がありますが、これはあまり単純ではありません。リソースエンティティに戻るためにのみ使用されるエンティティが概念モデルにあるようで、Resource.Children.Add(r) がデータベースの ResourceHierarchy テーブルに新しい行を作成するかどうかさえわかりません. 関係としてのみ使用しているエンティティから、プロパティ、つまり数量を選択するようなものです。
理想的には、ResourceHierarchy テーブルの Quantity 列は次のようになります。
Parent_ID Child_ID Quantity
10000 10001 1
10000 10002 1
10002 10003 8
10004 10003 13
そして、Resource Entity はまだ Children、Parents ナビゲーション プロパティを持ち、Resource Entity のプロパティとして Quantity 列に何らかの方法でアクセスします。
数量列があり、数量列がない場合に生成されたコードをマージしようとしましたが、例外がスローされ、ResourceHierarchy テーブルはリレーションシップまたはエンティティのいずれかであると解釈されますが、両方ではありません。
助けてください!
edmx は、db の ResourceHierarchy テーブルの数量列の追加と除外によって大幅に変更されます。
次に比較例を示します。唯一の違いは、Resource が ResourceType であり、ResourceHierarchy が ResourceTypeHierarchy であることです。
SSDL ストレージ モデルには、ResourceTypeHierarchy EntityType の 1 つの追加のプロパティを除いて変更がないため、以下には含めません。
RESOURCETYPEHIERARCHY に QUANTITY 列がありません
リソースタイプ階層は関係です
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema Namespace="MyModel" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
<EntityContainer Name="MyEntities">
<EntitySet Name="ResourceTypes" EntityType="MyModel.ResourceType" />
<AssociationSet Name="ResourceTypeHierarchy" Association="MyModel.ResourceTypeHierarchy">
<End Role="ResourceType" EntitySet="ResourceTypes" />
<End Role="ResourceType1" EntitySet="ResourceTypes" /></AssociationSet></EntityContainer>
<EntityType Name="ResourceType">
<Key>
<PropertyRef Name="ID" /></Key>
<Property Type="Int32" Name="ID" Nullable="false" />
<Property Type="String" Name="Type" Nullable="false" MaxLength="25" FixedLength="false" Unicode="false" />
<NavigationProperty Name="Parents" Relationship="MyModel.ResourceTypeHierarchy" FromRole="ResourceType" ToRole="ResourceType1" />
<NavigationProperty Name="Children" Relationship="MyModel.ResourceTypeHierarchy" FromRole="ResourceType1" ToRole="ResourceType" /></EntityType>
<Association Name="ResourceTypeHierarchy">
<End Type="MyModel.ResourceType" Role="ResourceType" Multiplicity="*" />
<End Type="MyModel.ResourceType" Role="ResourceType1" Multiplicity="*" /></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="MyModelStoreContainer" CdmEntityContainer="MyEntities">
<EntitySetMapping Name="ResourceTypes">
<EntityTypeMapping TypeName="IsTypeOf(MyModel.ResourceType)">
<MappingFragment StoreEntitySet="ResourceType">
<ScalarProperty Name="ID" ColumnName="ID" />
<ScalarProperty Name="Type" ColumnName="Type" /></MappingFragment></EntityTypeMapping></EntitySetMapping>
<AssociationSetMapping Name="ResourceTypeHierarchy" TypeName="MyModel.ResourceTypeHierarchy" StoreEntitySet="ResourceTypeHierarchy">
<EndProperty Name="ResourceType1">
<ScalarProperty Name="ID" ColumnName="Parent_ID" /></EndProperty>
<EndProperty Name="ResourceType">
<ScalarProperty Name="ID" ColumnName="Child_ID" /></EndProperty></AssociationSetMapping></EntityContainerMapping>
</Mapping>
</edmx:Mappings>
RESOURCETYPEHIERARCHY の QUANTITY 列を使用
RESOURCETYPEHIERARCHY はエンティティになりました
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
<EntityContainerMapping StorageEntityContainer="MyModelStoreContainer" CdmEntityContainer="MyEntities">
<EntitySetMapping Name="ResourceTypes">
<EntityTypeMapping TypeName="IsTypeOf(MyModel.ResourceType)">
<MappingFragment StoreEntitySet="ResourceType">
<ScalarProperty Name="ID" ColumnName="ID" />
<ScalarProperty Name="Type" ColumnName="Type" /></MappingFragment></EntityTypeMapping></EntitySetMapping>
<EntitySetMapping Name="ResourceTypeHierarchies">
<EntityTypeMapping TypeName="IsTypeOf(MyModel.ResourceTypeHierarchy)">
<MappingFragment StoreEntitySet="ResourceTypeHierarchy">
<ScalarProperty Name="Child_ID" ColumnName="Child_ID" />
<ScalarProperty Name="Parent_ID" ColumnName="Parent_ID" />
<ScalarProperty Name="Quantity" ColumnName="Quantity" /></MappingFragment></EntityTypeMapping></EntitySetMapping>
<AssociationSetMapping Name="FK_Child" TypeName="MyModel.FK_Child" StoreEntitySet="ResourceTypeHierarchy">
<EndProperty Name="ResourceTypeHierarchy">
<ScalarProperty Name="Child_ID" ColumnName="Child_ID" />
<ScalarProperty Name="Parent_ID" ColumnName="Parent_ID" /></EndProperty>
<EndProperty Name="ResourceType">
<ScalarProperty Name="ID" ColumnName="Child_ID" /></EndProperty></AssociationSetMapping>
<AssociationSetMapping Name="FK_Parent" TypeName="MyModel.FK_Parent" StoreEntitySet="ResourceTypeHierarchy">
<EndProperty Name="ResourceTypeHierarchy">
<ScalarProperty Name="Child_ID" ColumnName="Child_ID" />
<ScalarProperty Name="Parent_ID" ColumnName="Parent_ID" /></EndProperty>
<EndProperty Name="ResourceType">
<ScalarProperty Name="ID" ColumnName="Parent_ID" /></EndProperty></AssociationSetMapping></EntityContainerMapping>
</Mapping>
</edmx:Mappings>