3

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>
4

1 に答える 1

1

これは期待どおりに機能していると思います。つまり、2 つのエンティティ間の関係を確立するテーブルに属性を配置する場合、そのテーブルは (少なくともデータ表現理論から) 適切なエンティティとして表現されなければならないということです。よくよく考えてみればその理由がわかります。あなたが言及した数量は、関連エンティティの属性ではなく、関係の属性です。そのため、テーブルは関係としてではなく、エンティティとして扱う必要があります。

これを克服する方法について、私の頭に浮かぶことの1つは(これがあなたの問題を完全に解決するかどうかはわかりませんが)、最初に考えたように(量なしで)関係を扱い、別のテーブルを用意することです(それは特定の関係の数量を格納するモデル内のエンティティにマップされます)。このテーブルは、元の関係テーブルに対してデータベースに外部キー制約を設定することもできると思いますが、この外部キーをモデルの関係にマップすることはできません (エンドポイントのエンティティがないため)。ストレージのデータの整合性を維持できます。

これが役に立てば幸いです、Vítor

于 2010-09-20T08:12:47.167 に答える