3

OK ce problème a tout. Conceptuellement, j'ai une entité de ressources qui peut avoir de nombreuses ressources enfants et de nombreuses ressources parentales. La table de ressource a deux champs, l'identification et le nom avec l'identification étant la clé primaire. Pour compléter la relation many to many, j'ai créé une table ResourceHierarchy qui a deux champs, (Parent_ID, Child_ID) et deux clés étrangères avec chacune référençant la clé primaire de la table de ressources (ID) et la table ResourceHierarchy a un Maintenant, nous savons déjà que chaque ressource peut agir comme un parent ou un enfant pour d'autres ressources, mais logiquement, toutes les ressources n'auront pas de parent, mais c'est à côté du point. A titre d'exemple, disons que j'ai les ressources suivantes dans ma table de ressources.Entity Framework Auto Référencement Hiérarchique Beaucoup à Beaucoup

ID Name 
10000 Little House 
10001 Font Door 
10002 Roof 
10003 Roof Tile 
10004 Tile Monster 

Et dans la table ResourceHierarchy, nous avons les relations suivantes.

Parent_ID Child_ID 
10000  10001 
10000  10002 
10002  10003 
10004  10003 

Ensuite, Entity Framework génère l'entité, so far so good ...

Si vous deviez vérifier le code généré dans le fichier edmx vous verriez que la table ResourceHierarchy est traitée comme une relation et la table ResourceHierarchy n'est pas accessible via le code car elle n'est pas traitée en tant qu'entité.

Si c'est tout ce que je voulais alors ça fonctionnerait parfaitement.

Toutefois, le problème commence lorsque je souhaite ajouter une colonne de quantité à la hiérarchie d'entité de ressources. Par exemple la petite maison a juste une porte avant et un toit, mais les ressources de toit et de mosaïque de tuile peuvent avoir beaucoup de tuiles de toit. Par conséquent, si nous ajoutons une colonne Quantité au tableau Ressource, nous obtenons ce qui suit:

ID Name   Quantity 
10000 Little House 1 
10001 Font Door 1 
10002 Roof 1 
10003 Roof Tile 5 
10004 Tile Monster 1 

Ceci crée le problème que le toit et le carrelage doivent partager les 5 tuiles de toit. Donc naturellement je voudrais essayer d'ajouter la colonne de quantité à la table de ResourceHierarchy, cependant dès que je fais ceci et actualise le code généré traite maintenant la table de ResourceHierarchy comme une entité et pas une relation comme c'était précédemment. Et maintenant, pour revenir à la table des ressources, je dois passer par cette «Entité/Relation» non conceptuelle qui n'est pas très simple. C'est comme si j'avais une entité dans mon modèle conceptuel qui ne serait utilisée que pour revenir à l'entité de ressource, et je ne suis même pas sûr que Resource.Children.Add (r) créerait de nouvelles lignes dans la table ResourceHierarchy dans la base de données. . C'est comme si je cueillais des propriétés, c'est-à-dire de la quantité, d'une entité que j'utilise seulement comme une relation.

Idéalement, la table ResourceHierarchy devrait avoir la colonne Quantité.

Parent_ID Child_ID Quantity 
10000  10001 1 
10000  10002 1 
10002  10003 8 
10004 10003 13 

et l'entité des ressources aurait encore enfants, les parents propriétés de navigation et accéder en quelque sorte la colonne Quantité comme propriété de la ressource entité. J'ai essayé de fusionner le code généré d'avoir une colonne de quantité et de ne pas avoir une colonne de quantité mais une exception est levée que j'interprète comme la table ResourceHierarchy peut être une relation ou une entité, mais pas les deux.

S'il vous plaît HELP! L'edmx change radicalement avec l'ajout et l'exclusion de la colonne quantité dans la table ResourceHierarchy dans la base de données.

Voici une comparaison d'exemples, la seule différence est Resource est ResourceType et ResourceHierarchy est ResourceTypeHierarchy. Le modèle de stockage SSDL ne comporte aucune modification sauf une propriété supplémentaire dans ResourceTypeHierarchy EntityType. Je ne l'incluerai donc pas ci-dessous.

SANS COLONNE DE QUANTITE SUR RESOURCETYPEHIERARCHY

RESOURCETYPEHIERARCHY EST UNE RELATION

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

AVEC COLONNE DE QUANTITE SUR RESOURCETYPEHIERARCHY

RESOURCETYPEHIERARCHY EST MAINTENANT UNE ENTITÉ

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

Répondre

1

Je crois que cela fonctionne comme espected. Ce que je veux dire, c'est que si vous mettez un attribut sur une table qui établit une relation entre deux entités, cette table DOIT (à partir de la théorie de la représentation des données au moins) être représentée comme une entité propre. Si vous y réfléchissez bien, vous comprendrez pourquoi. La quantité que vous avez mentionnée est un attribut de la relation et non de l'une des entités apparentées. En tant que tel, ce tableau doit être traité comme une entité et non comme une relation. Maintenant, sur la façon de surmonter cela, une chose qui me vient à l'esprit (bien que je ne sache pas si cela résoudra complètement votre problème) est de traiter la relation comme vous l'avez pensé (sans la quantité) et d'avoir une autre table (qui sera mappée à une Entité dans votre modèle) qui stocke la quantité d'une certaine relation. Je pense que cette table peut même avoir une contrainte de clé étrangère sur vous db à la table de relation d'origine, bien que cette clé étrangère ne puisse pas être mappée à une relation sur votre modèle (car vous n'avez aucune entité pour le point de terminaison) vous permet de préserver l'intégrité des données sur votre stockage.

Espérons que cela aide, Vítor

Questions connexes