0

나는 최선의 해결책을 모르는 문제가 있습니다. 다행히도 여기 누군가가 도움이 될 수 있습니다.)유창한 매핑 상속

해결하려는 내용 : 시스템, 사람 및 조직에 사용자를 입력해야합니다. 둘의 공유 로그인 테이블을 갖고 싶습니다. 즉, 사용자가 어떤 유형의 사용자인지 알 수 없으며 사용자 이름과 암호와 관련이 있습니다. 그래서 사용자 이름과 암호에 대한 로그인 테이블을 만들었습니다. 하지만 로그인이 연결된 사람을 알아야하므로 사람이나 조직에 대한 참조가 필요합니다.

public class Login 
{ 
    public string Username {get; set;} 
    public string Password {get;set;} 
} 

public class LoginPerson : Login 
{ 
    public Person Person {get;set;} 
} 

public class LoginOrg : Login 
{ 
    public Organization Organization {get;set;} 
} 

public class Person 
{ 
    public LoginPerson LoginPerson {get;set;} 
    //Lots of other properties. Removed for simplicity 
} 

public class Organization 
{ 
    public LoginOrg LoginOrg {get;set;} 
    //Lots of other properties. Removed for simplicity 
} 

사람의 구성은 다음과 같이 설정 :

은 (간체) 다음과 같은 클래스 고려 모든

public class PersonConfiguration : EntityTypeConfiguration<Person> 
    { 
     public PersonConfiguration() 
     { 
      HasRequired(p => p.LoginPerson).WithRequiredPrincipal(p => p.Person); 
     } 
    } 

먼저,이 작동하지 않습니다. 예외가 발생합니다. "System.Data.EntityCommandCompilationException : System.Data.EntityCommandCompilationException : 명령 정의를 준비하는 동안 오류가 발생했습니다. 자세한 내용은 내부 예외를 참조하십시오.> System.Collections.Generic.KeyNotFoundException : 제공된 키 사전에 없었어요 .. " 내 첫 번째 질문은 왜 이렇게 작동하지 않는 것입니까? 두 번째 질문은 어떤 전략이 이러한 종류의 상속에 가장 적합한가요? TPT, TPH 또는 TPC?

답변

0

예외적으로 올바른 구성을 설정하는 해결책은 입니다. PersonConfiguration은 LoginPerson 등록 정보에 대한 구성을 포함 할 필요가 없습니다. >

public class LoginPersonConfiguration : EntityTypeConfiguration<LoginPerson> 
{ 
    public LoginPersonConfiguration() 
    { 
     ToTable("LoginPerson"); 
     HasKey(l => l.Id); 
     HasRequired(l => l.Person).WithOptional(p => p.LoginPerson).Map(t => t.MapKey("PersonId")); 
    } 
} 

을 그리고 또한 가장 적합한 전략, 내가 TPT 가기로 결정했다고 오면 DbContext 클래스

public class MyDbContext : DbContext 
{ 
    public DbSet<Person> Persons { get; set; } 
    public DbSet<Login> Logins { get; set; } 
} 

에 로그인을 추가했다 - 나는 LoginPersonConfiguration을 추가했습니다.

1

글쎄, 처음 엔 엔티티에 키가 없습니다. 기본 키가 필요합니다. EF는 PersonId와 같이 클래스 이름에 끝에 ID (예 : PersonId)를 사용하거나 키가 [Key]

이고 명시 적이어야합니다. 둘째로, 모델이 혼란스럽고 상당히 원형입니다. 기본 키가 없으면 연결을 만들 수있는 방법이 없습니다.

Person 개체에 LoginPerson 구성원이 있고 조직에 동일한 구성원이있는 이유에 대해 혼란스러워합니까? 어쨌든이 모델을 다시 생각하고 열쇠가 무엇인지 파악해야합니다.

+0

기본 키를 포함하지 않아서 죄송합니다. 나는 수업을 단순화 할 때 수업을 삭제했습니다. 모든 클래스에는 PK 인 Id 열이 있습니다. 순환 참조는 탐색 속성이므로 의도적입니다. 그러나, 나는 예외 문제를 해결했다. 그리고 내 두 번째 질문은 Google = – Zaphod