3

I 데이터베이스에서 다음 스키마 있습니다엔티티 프레임 워크 : 조건부 외래 키

  • BillingReferences (ReferencingType TINYINT이, TINYINT, ReferencedType 에게 TINYINT을 ReferencingId TINYINT을 ReferencedId,이 isActive 비트) - 모든 필드 (IsActive 제외)는 고유 인덱스의 일부입니다.
  • BillingType (BillingTypeId TINYINT 이름 VARCHAR (50))

ReferencingType 및 ReferencedType는 BillingTypes의 외래 키이다. BillingTypes에 다음 행이 있습니다.

BillingTypeId | 이름

1 | 레이블

2 | 국가 :

3 | PaymentProviders

4 | PaymentOptions

5 | 은행

다음 엔터티 중 하나가 (참조 된/참조하는 유형에 따라 다름)의 ReferecingId 및 ReferencedId는 이드 대표

:

  • 은행 (BankId TINYINT, 이름 VARCHAR를 (50))
  • 나라 (CountryId TINYINT, 이름 VARCHAR (50))
  • 라벨 (LabelId TINYINT 이름 VARCHAR (50))
  • PaymentProviders (PaymentProviderId TINYINT 이름 VARCHAR (50))
  • PaymentOptions (PaymentOptionId TINYINT , 이름 varchar (50))

미래에는 각 엔티티에 더 많은 다른 열이 추가되지만 지금은 단순화를위한 스키마입니다.

국가 (국가 제외) 사이에 (1- ) 개의 연결이 있습니다. 레이블의 뱅크, PaymentProviders 및 PaymentOptions에 대한 (1-)의 연결이 있습니다.내가 CountryId 3003 과 국가에 BankId (201)과 은행을 연결하려는 경우 그리고 PaymentProviders 내가 그 모양을 BillingReferences에 기록이됩니다 PaymentProviders

그래서 예를 들어

의 연결 (1 *)가 : ReferencingType = 5 ReferencingId = 201 ReferencedType = 2 ReferencedId = 3003 이 isActive = 1

우리 때문에 확장 성 고려의 각 유형의 접속에 대한 연결/참조 테이블을 만들지 않았다 - 우리가 추가하려면 우리가해야하는 또 다른 엔티티는 그 테이블을 추가하고 그것에 대한 레코드를 추가하는 것입니다. BillingReferences 및 BillingType.

문제는 내가 엔티티의 조건부 외국 BillingReferences 사이의 키와 각을 구성 할 수 없습니다 내가

내가 찾을 수 없습니다 .../구성 중 하나 EntityFramework로 매핑하는 것 같지 수 있다는 것입니다 이 유형의 구현을 사용하는 자습서 또는 예제 각 연결에 대한 참조 테이블을 만들겠습니까, 아니면 EntityFramework를 사용하여이 테이블을 구성 할 수 있습니까? 도움말 :

답변

1

AFAIK, 거기에 대한

덕분에이 작업을 수행 할 수있는 방법이 아니다.

나는 당신이 정말로 좋은 이유가 없다면, 각 유형에 대해 별도의 테이블을 만들 것이라고 생각합니다. 당신이 언급 한 고려 사항은 좋은 것이 아닙니다. IMHO.

테이블이 많을수록 외래 키 제약 조건을 키에 넣을 수 있으며 EF로 잘 변환됩니다. 또한 실적 향상에 도움이됩니다. 1 백만 행이있는 큰 엉덩이 참조 표는 더 작은 테이블보다 쿼리에 더 많은 시간이 걸립니다 (유형에 대한 모든 참조가 항상 필요하지 않는 한).

+0

"항상 모든 유형의 참조를 원하지 않는 한 ... -항상 특정 은행과 관련된 모든 국가 또는 특정 라벨과 연결된 모든 은행을 보여 드리겠습니다. 사용자는 원하는 엔터티를 선택한 엔터티와 연결/연결 해제 할 수 있어야합니다. – Captain

1

Entity Framework에서이 작업을 수행 할 방법이 없을뿐만 아니라 SQL에서도 수행 할 수있는 방법이 없습니다. 다섯 개의 다른 테이블 중 하나를 참조하는 외래 키를 가질 수 없습니다.

내가 대신해야 할 일은 부모, 추상 참조 유형 및이 상위 유형의 구체적인 유형 하위 유형을 만드는 것입니다. 이제 하나의 테이블에 하나의 외래 키만 있습니다. 유형별 테이블 또는 계층 구조 당 테이블 매핑을 선택할 수 있습니다. 언급 한 유형에서 특별한 열이 전혀 없다는 것을 감안할 때 table per hierarchy mapping이 더 나은 선택이라고 생각합니다.

+0

모든 엔티티에 고유 한 특수 열이 있다고 말할 수 있습니다. 방금 ​​단순화 된 버전을 설명했습니다 ... 계층 구조 매핑 당 테이블이 저에게 어떻게 도움이되는지 알 수 없습니다 ... – Captain

+0

더 나은 경우 유형별로 테이블을 수행하십시오. 질문에 표시되지 않는 부품. 요점은 수퍼 유형을 사용하면 DB에서 실제 외래 키를 사용할 수 있으므로 EF가 원하는 매핑을 제공한다는 것입니다. –

0

글쎄, 나는 인페르 시스의 제안을 사용하고 각 유형에 대해 별도의 표를 만들 예정이라고 생각합니다.

는 답변 너희들을 감사 - 그들은 :

1

당신은 당신이 원하는 것을 달성 할 수있는 유일한 방법은 서버 측에서 처리를 처리하는 트리거를 구축하는 것입니다 많은 도움을 주었다. FK를 여러 테이블에 매핑 할 수 없습니다. 그러나 방아쇠는 그 논리를 다룰 수 있습니다. 물론 그것은 완전히 EF 밖에있을 것입니다 ...

또한 각 유형별로 별도의 테이블을 만드는 것이 좋습니다. 장기적으로는 유지하기가 더 간단합니다.

0

SQL에서는 단일 테이블을 기반으로 각 유형에 대한보기를 만들 수 있습니다. 각보기는 조인을 수행하여 해당 유형과 관련된 정보를 검색 할 수 있습니다. 이렇게하면 링크가 전체 유형을 무시한다고 생각할 수도 있습니다.

관련 문제