3

OK이 문제는 모두 해결되었습니다.엔터티 프레임 워크 자체 참조 계층 적 다수 대 다수

개념적으로 많은 하위 리소스와 많은 상위 리소스를 가질 수있는 리소스 엔터티가 있습니다. 자원 테이블에는 기본 키인 ID와 ID라는 두 개의 필드가 있습니다.

다 대다 관계를 완료하기 위해 Resource 테이블의 두 필드 (Parent_ID, Child_ID)와 각각 리소스 테이블 (ID)의 기본 키를 참조하는 두 개의 외래 키가 있고 ResourceHierarchy 테이블에는 (Parent_ID, Child_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 

그리고 엔티티 프레임 워크는 지금까지 너무 좋아 엔티티를 ... 생성 당신이 ResourceHierarchy 테이블의 관계로 취급되고 있음을 볼 것 edmx 파일에 생성 된 코드를 확인한다면

엔티티로 취급되지 않기 때문에 코드를 통해 ResourceHierarchy 테이블에 액세스 할 수 없습니다.

이것이 전부라면 나는 완벽하게 작동 할 것이다.

그러나 리소스 엔터티 계층 구조에 수량 열을 추가하려고 할 때 문제가 발생합니다. 예를 들어, 작은 집에는 프런트 도어 1 ​​개와 지붕 1 개가 있지만 지붕 및 타일 몬스터 자원에는 많은 지붕 타일이있을 수 있습니다.

리소스 테이블에 수량 열을 추가하면 다음과 같이 표시됩니다.

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 테이블로 되돌아 가려면이 개념이 아닌 "Entity/Relationship"을 따라 가야합니다. 이는 매우 간단하지 않습니다. 마치 Resource Entity로 돌아가는 데에만 사용되는 개념 모델에 Entity가 있고 Resource.Children.Add (r)가 db의 ResourceHierarchy 테이블에 새 행을 작성하는지 확실하지 않습니다. . 그것은 내가 관계로서 만 사용하고있는 엔티티의 속성, 즉 수량을 선택하는 것과 같습니다.

이상적으로 ResourceHierarchy 테이블의 Quantity 열은 다음과 같습니다.

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

그리고 리소스 엔터티는 여전히 자식, 부모 탐색 속성을 가지며 리소스 엔터티의 속성으로 수량 열에 액세스합니다.

수량 열과 수량 열이없는 생성 된 코드를 병합하려고했지만 ResourceHierarchy 테이블이 관계 또는 엔티티 중 하나 일뿐만 아니라 둘 다일 수 있으므로 해석하는 예외가 throw됩니다.

Please HELP!

db의 ResourceHierarchy 테이블에 수량 열을 추가하거나 제외하면 edmx가 크게 변경됩니다.

다음은 샘플 비교입니다. 유일한 차이점은 Resource is ResourceType이고 ResourceHierarchy는 ResourceTypeHierarchy입니다.

SSDL 저장소 모델은 ResourceTypeHierarchy EntityType에 하나의 추가 속성을 제외하고 변경 사항이 없으므로 아래에 포함하지 않을 것입니다. RESOURCETYPEHIERARCHY ON 수량 COLUMN WITHOUT

RESOURCETYPEHIERARCHY는

RESOURCETYPEHIERARCHY 지금

,369,136 엔티티 일 RESOURCETYPEHIERARCHY ON 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> 

IS3210

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

답변

1

나는 espected으로이 작업을 믿습니다. 제 말은 두 엔티티 사이의 관계를 설정하는 테이블에 속성을 넣으면 해당 테이블을 적절한 엔티티로 표시해야한다는 것입니다 (적어도 데이터 표현 이론에서). 이 점에 대해 신중하게 생각한다면 이유를 이해하게 될 것입니다. 언급 한 수량은 관련 엔티티가 아닌 관계의 속성입니다. 따라서 테이블은 관계가 아닌 엔티티로 취급되어야합니다.

이제 이것을 극복하는 방법에 관해서는, 내 마음에 오는 한가지는 (비록 이것이 이것이 당신의 문제를 완결하게 해결할 지 모르겠지만) 당신이 원래 생각한대로 (양없이) 관계를 치료하고 다른 특정 관계의 수량을 저장하는 테이블 (사용자 모델의 Entity에 매핑 됨). 이 외래 키를 관계형에 매핑 할 수는 없지만이 테이블에는 원래 관계 테이블에 대한 외래 키 제약 조건이있을 수 있다고 생각합니다 (끝점에 대한 엔티티가 없으므로) 스토리지에서 데이터 무결성을 유지할 수 있습니다.

희망 하시다. 님께 서