2013-09-23 1 views
0

Login 개체의 속성으로 사용하려는 다음 클래스가 있습니다. 이 클래스는 모든 탐색 속성이없는 것을 선호합니다 (가능한 빠른 검사를 위해 사용될 것입니다). 가능하면 가능하지만 아래에 표시된 것을 허용 할 것입니다.복합 키가있는 Entity Framework의 일대 다 관계

public class LoginFeature 
{ 
    [Key, Column(Order = 0)] 
    public int RoleId { get; set; } //Role is another table in the db, but not looking for a nav. property or constraint here. 

    [Key, Column(Order = 1)] 
    public virtual Login Login { get; set; } 

    public bool Deny { get; set; } 
} 

이들의 컬렉션을 포함하는 클래스는

public class Login 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } //Database ID 

    public virtual List<LoginFeature> LoginFeatures { get; set; } 
} 

내 DbContext가

public class MyContext : DbContext 
{ 
    public DbSet<Login> Logins { get; set; } 
    public DbSet<LoginFeature> LoginFeatures { get; set; } 
} 

로 정의하지만, 다음 테스트가 말하는 오류가 발생합니다 (공간을 벗었)되어

을 그

System.Data.Entity.Inf rastructure.DbUpdateException : 해당 관계의 외래 키 속성을 노출하지 않는 엔터티를 저장하는 동안 오류가 발생했습니다. 단일 엔터티를 예외 소스로 식별 할 수 없으므로 EntityEntries 속성은 null을 반환합니다. 엔터티 형식에 외래 키 속성을 노출하면 저장 중에 예외를 쉽게 처리 할 수 ​​있습니다. 자세한 내용은 InnerException을 참조하십시오. ----> System.Data.UpdateException : 항목을 업데이트하는 동안 오류가 발생했습니다. 자세한 내용은 내부 예외를 참조하십시오. ----> System.Data.SqlClient.SqlException : 열 'RoleId'테이블에 NULL 값을 삽입 할 수 없습니다 'TEST.dbo.LoginFeatures'테이블; 열이 널을 허용하지 않습니다. INSERT가 실패합니다. 명세서가 종료되었습니다.

[Test] 
    public void LoginCanHaveFeatures() 
    { 
     using (var ctx = new MyContext()) 
     { 
      var login = ctx.Logins.FirstOrDefault(x => x.Id == 30); 
      Assert.IsNotNull(login); 

      for (int i = 10; i < 15; i++) 
      { 
       var feature = new LoginFeature(); 
       feature.Login = login; 
       feature.RoleId = i; 
       feature.Deny = true; 
       login.LoginFeatures.Add(feature); 
      } 

      ctx.SaveChanges(); 
     } 
    } 

는 SQL이 EFProf에서 쇼로 생성되는 것은 LoginFeature이 잘못에 데이터 주석 속성을 암시하는 것 같다

insert [dbo].[LoginFeatures] 
    ([Deny], 
    [Login_Id]) 
values (1 /* @0 */, 
    30 /* @1 */) 

입니다. 내가 할 수있는 일이 가능합니까?

감사합니다,

답변

1

당신은 키로 탐색 속성을 정의 할 수 없습니다. 기본 속성 만 키로 지원됩니다. 그래서, 당신과 같이 클래스를 정의해야합니다 :

public class LoginFeature 
{ 
    [Key, Column(Order = 0)] 
    public int RoleId { get; set; } 

    [Key, Column(Order = 1)] 
    public int LoginId { get; set; } 

    public virtual Login Login { get; set; } 

    public bool Deny { get; set; } 
} 

매핑 규칙은 Login에 대한 LoginId 외국 키를 감지합니다. EF는 네비게이션 속성에서와 같이 두 번째 키 속성을 무시하고 첫 번째 키인 RoleId 만 사용하고 기본적으로 (단일 키의 경우) 키가 데이터베이스에서 자동 생성된다고 가정합니다 (분명히 isn이 아닙니다. 't) 그 값을 데이터베이스에 보내지 않습니다.