2

분명히 여기 .net과 싸우고 있습니다 ... 그리고 그 대답은 아마도 내가 잘못된 트리를 짖고 있으며 단지 5 년 동안 데이터베이스 디자인을 사용하는 것만으로 계속 진행해야한다는 것입니다. 전에.엔티티 프레임 워크 : 다중 상속

내가 원하는 것은 추상적 인 객체 클라이언트를 가지고 있으며 상속 된 객체가 2 개 상속 된 공급자 및 고객입니다.

클라이언트 모두 공급 업체 및 고객과의 관계가 1 : 0/1이이 레버뿐만 아니라 적은 유효성 검사 코드를 작성하는 저를 가능하게하는 것처럼 상속을 기반으로하는 솔루션은 잘 작동한다는 것을 의미하는 것 같다

강력하게 형식화 된 콜렉션.

그러나 엔티티 프레임 워크는 클라이언트 테이블에서 고유 ID를 사용하고 Customer 테이블과 공급 업체 테이블에서 참조 된 동일한 ID를 사용할 수 없도록합니다.

데이터베이스에 들어가서 상속 된 개체에서이 ID를 수동으로 편집하면 클라이언트 컬렉션에 인덱스 충돌이 발생하기 때문에 (문제는 아님) 문제가 발생합니다.

결과적으로 공급 업체와 고객으로 보이는 클라이언트를 가질 수 없게되었습니다 (동일한 ID를 공유하는 2 개의 별도 개체에 대한 아이디어에 만족했습니다).

이것은이 시나리오를 가장 잘 모델링하는 방법에 대한 디자인 문제로 연결됩니다 ... 'isCustomer', 'isSupplier'또는 참여하는 공급 업체 및 고객 테이블에 대한 조건부 조인 및 부울 필드를 수행해야 할 위험이 있습니다. 클라이언트와 코드를 작성하여 0-1 관계를 유지합니다.

다른 사람이 이런 종류의 문제가 있었나요? 우아한 해결책이 없습니까?

대안 : 동일한 개체를 여러 번 볼 필요가 있습니다. 즉, 한 필드에서 정수 값을 가질 수 없어 어떤보기가 허용되는지 결정할 수 없습니다. 어떤 bool 필드를 사용하여 어떤 객체 뷰가 허용되는지 결정해야합니다.

EF에서 가능한가요? 분명히 DB에서 뷰를 만들 수 있지만 ID 대신 EF에서이 작업을 수행하고 SQL을 생성해야합니다. (비록 내가 이미 sp를 정의하여 다양한 키와 제약 조건을 db에 설정하고 있지만 이것은 스키마를 생성하기 위해 EF를 사용하여 포기할 것을 의미한다)

답변

1

불행히도, 당신이 요구하는 것은 실제로 가능하지 않습니다. .NET에서는 다중 상속을 허용하지 않으므로 EF 나 다른 ORM의 기능이 아닙니다.

EF 디자이너에서 상속을 제거하고 테이블간에 일반적인 1 : 1 * 연결 만 허용해야합니다.

당신은 당신이 찾고있는 데이터베이스 설계하게 될 겁니다, 그리고 C#을 구문은 다음과 같이 표시됩니다 EF 5 세 여전히 해결되지 않은 경우

Client c; 

c.Customer.[...] 
c.Supplier.[...] 
+0

IDD 슬프게도이 내가 오는하고 결론 ... 그게 내가 지금까지 가지고 올 한 간단하다. 적어도 ORM은 1 : 0/1을 관리합니다. 그냥 상속을 통해 선호 associatino의 옛 addage을 보여줍니다 다시 한번 규칙 (지금까지) –

0

고객과 공급 업체에게 공통된 것을 넣어 라. 고객 및 고객의 특정 고객만을 대상으로합니다.

3 개의 테이블, 3 가지 유형의 개체.

+0

감사합니다를, 그러나이 날 * 모두 * 공급 업체 및 고객입니다 하나의 클라이언트를 허용하지 않습니다. –

+0

오, 나는 네가하는 말을 보았다. 어쩌면 모든 고객 및 공급 업체 필드가있는 테이블을 보유하고 있을까요? – Beth

+0

그래 그 하나 개의 옵션입니다 ...하지만 난 별도의 테이블로 공급 업체 및 고객 필드를 정상화 수 있기 싫어 - 공급 업체 ID와 고객 ID를 사용하여 클라이언트를 떠나 모두 열에 고유 키를 적용합니다. (고통에게 엉덩이를 메신저;)하지만 덕분에) –

0

내가이 게시물을 알고 ...

은 어쩌면 내가 모르는 뭔가가있어,하지만 EF 여러 아이들이 부모로부터 상속 못하게하고 소프 트가 완벽하게 할 수있다. 모든 엔티티를 부분 클래스로 변경 한 다음 모든 부분 클래스가 구현하는 인터페이스를 정의하여이를 해결할 수 있습니다. 그것은 말도 안돼. CreatedBy, CreatedOn, UpdatedBy, UpdatedOn : 우리의 데이터베이스에있는 모든 단일 테이블은 4 열이 있습니다. 내가 엔티티 프레임 워크의 추상 클래스를 만드는 경우 나는 모든 기관이 네 개의 필드를 가지고 그래서이 하나 개의 추상 클래스에서 모든 개체를 상속 할 수 있어야한다. 그러나 당신은 할 수 없습니다. 하나의 테이블 만 추상 클래스에서 상속받을 수 있습니다. 그것은 말도 안돼. 그것은 추상 클래스의 목적을 전혀 상실합니다. 나는 모든 실체가이 네 가지 들판을 갖고 싶어하지만 오직 한 아이 만이 네 가지 들판을 가질 수있다. 기업은이 네 가지 분야가 있어야합니다. 시설의 법인 인 아동은 또한이 네 가지 분야가 있어야합니다. 하지만 싫어, 그럴 수 없어. TimeStampTable이 추상 클래스는 비록 하나 개의 테이블 상속 할 수 있으며 하나의 테이블이 네 개의 필드 여기

를 얻을하는 엔티티 다이어그램을이다

enter image description here

..... 어쨌든, 내가 느끼는 당신의 고통과 주위에 일이있다. 엔티티를 부분 클래스로 변경 한 다음 모든 엔티티에 대한 별도의 파일에서 해당 인터페이스의 부분 클래스를 상속받습니다.

모든 부분 클래스 파일에서 직접 인터페이스를 구현해야합니다.

행운 (또는 다른 ORM 찾기)이 내가 한 일이다