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>