코드 첫 번째 접근 방식을 사용하여 Entity Framework에서 데이터 모델을 작성하는 중이지만 한 부분에서 저에게 다소 혼란 스럽습니다. 이 질문의 제목은 다소 혼란 스러울 수 있으므로 문제를 자세히 설명하겠습니다. 이 게시물의 길이는 매우 어려울 수 있지만 상당히 간단한 문제라고 생각합니다.코드 우선 접근 방식에서 많은 테이블을 하나의 테이블 관계로 정의
는 I는 다음과 같이 하나 개의 모델을 정의 : 이것은 단지 시스템의 다른 기관에 키 - 값의 속성을 저장하는 일반적인 테이블을 정의하는
public class KeyValuePair
{
[Key]
[MaxLength(128)]
[Column(Order = 0)]
public virtual string OwnerId { get; set; }
[Key]
[MaxLength(128)]
[Column(Order = 1)]
public virtual string Key { get; set; }
public virtual string Value { get; set; }
}
내 의도입니다. 모든 ID에 대해 GUID를 사용하고 있으므로 OwnerId
은 시스템의 한 엔티티를 고유하게 참조해야하며 (OwnerId, Key)
쌍은 하나의 엔티티에서 하나의 속성을 고유하게 식별해야합니다.
즉, 내 시스템의 여러 테이블에이 KeyValuePair
에 대한 1 -> 많은 관계가 있도록 허용하려고합니다. 나는에서 탐색 속성을 정의 할
OwnerId = "b4fc3e9a-2081-4989-b016-08ddd9f73db0"
Key = "Height"
Value = "70 in."
을 이제 : 나는 ID b4fc3e9a-2081-4989-b016-08ddd9f73db0
이있는 사람의 높이를 저장하기를 원한다면으로
그래서 예를 들어,이 테이블의 행을 저장하는 것
public class Person
{
[Key]
public virtual string Id { get; set; }
public virtual string Name { get; set; }
// I want this to be a navigation property
public ICollection<KeyValuePair> Properties { get; set; }
}
그러나 나는 그렇게 엔티티 프레임 워크는 인당 찾아 볼 것을 알고 Person
및 KeyValuePair
사이의 관계를 정의 할 방법을 잘 모르겠어요 :이 테이블에 부모 엔티티처럼 (인격 예를 데리고) on의 속성을 Person
의 Id
과 KeyValuePair
의 'OwnerId
'에 일치시킴으로써 OwnerId
은 여러 테이블에서 ID를 참조하기 때문에 KeyValuePair
모델에서 외래 키를 정의 할 수 없습니다.
그것은 내가 OnModelCreating
에서 KeyValuePair
에 Person
에서 관계를 정의하기 위해 다음과 같은 작업을 수행 할 수처럼 보이는 : OwnerId
제거,
modelBuilder.Entity<Person>()
.HasMany(p => p.Properties).WithMany().Map(mp =>
{
mp.MapLeftKey("Id");
mp.MapRightKey("OwnerId", "Key");
mp.ToTable("PersonDetail");
});
을 아니면 심지어 KeyValuePairs에게 자신의 고유 ID를 줄 수 있고, 이 작업을 수행 :
modelBuilder.Entity<Person>()
.HasMany(p => p.Properties).WithMany().Map(mp =>
{
mp.MapLeftKey("Id");
mp.MapRightKey("Id");
mp.ToTable("PersonDetail");
});
그러나 이러한 접근 방식 모두 중간 테이블의 생성이 Person
를 링크 포함을 그리고 KeyValuePair
테이블, 그리고 그건 내 데이터베이스 스키마를 부풀게하고 데이터를 쿼리하는 데 더 비싼 조인을 요구 측면에서 과도한 오버 헤드처럼 보인다.
그래서 중개 테이블을 포함 할 필요가없는 관계를 정의하는 방법이 있습니까? 이 데이터베이스 디자인에 대해 잘못된 생각을하고 있습니까?
사이드 노트 : 사람이 왜 내 개체에 대한 속성을 정의하기 위해이 방법을 사용하고 궁금해하기보다는 단순히 데이터 모델에 고정 된 속성을 추가, 데이터 모델 적용 가능한 고정 속성을 사용하여 I 오전하지만, 구축하고있는 응용 프로그램에는 런타임에 사용자 정의 속성을 정의 할 수있는 기능이 필요합니다. 또한이 질문은 여러 테이블이 공유 테이블에 대해 1 -> 많은 관계가있는 다른 잠재적 시나리오에 적용 가능하다고 생각합니다.
쉬운 방법 : http://stackoverflow.com/questions/13953675/modelling-polymorphic-associations-database-first-vs-code-first –
마지막 코드 예제에서 구조화 된 방법 (' KeyValuePair 자체의 고유 ID)는 일대 다 (즉, 'HasMany' + WithMany')가 아닌 다 대다 (Many-to-Many)로 구성됩니다. – IronMan84