2014-12-02 6 views
0

다음 엔티티 클래스/모델이 있습니다.EF는 많은 관계에서 원하지 않는 필드를 추가합니다.

public class AppUser : IdentityUser<int, AppUserLogin, AppUserRole, AppUserClaim>, IUser<int> 
    { 
    // has inherited property : public int Id 
     public virtual ICollection<TenantAdmin> TenantAdmins { get; set; } 
     ... 
    } 

     public class Tenant 
    { 
     public int Id { get; set; } 
     public virtual ICollection<TenantAdmin> TenantAdmins { get; set; } 
     ... 
    } 

내가

public class TenantAdmin 
    { 
     public int AppUserId { get; set; } 
     public virtual AppUser AppUser { get; set; } 
     public int TenantId { get; set; } 
     public virtual Tenant Tenant { get; set; } 
    } 

그들을 묶어 클래스를 가지고 그리고 내 DBContext 클래스

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

    modelBuilder.Entity<TenantAdmin>().HasKey(x => new { x.TenantId, x.AppUserId }); 
    ... 
} 

많은 - 투 - 많은 관계가 잘 작동에 이어 DB가 가지고있는 필드, 키/fkeys. appuser를 삭제할 때 링크에서 cascadedelete를 구성해야한다는 오류가 발생했습니다.

내 OnModdeling에서 다른 코드 조합을 시도했지만 두 번째 AppUserID와 TenantId가 TenantAdmin 테이블에 추가되는 성가신 결과가 있습니다. 심지어 이중 키 정의를 제거하고 Ten 속성을 TenantAdmin 클래스에 추가 할 때도 마찬가지입니다.

modelBuilder.Entity<Tenant>().HasMany(x => x.TenantAdmins).WithOptional().WillCascadeOnDelete(true); 
modelBuilder.Entity<AppUser>().HasMany(x => x.TenantAdmins).WithOptional().WillCascadeOnDelete(true); 

무엇을하고 싶습니까? TenantAdmin없이 AppUser, Tenant를 자유롭게 만들 수 있습니다. 해당 AppUser 및 Tenant가있는 경우에만 TenantAdmin을 만듭니다. AppUser를 삭제할 때 관련된 모든 TenantAdmin이 삭제됩니다 (Tenant를 삭제할 때도 마찬가지 임). 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

.WithOptional. Required .....에 대한 완전한 설명에 대한 링크는 샘플과 함께 제공됩니다. Google은 내가 지금까지 찾고있는 것을 가져 오지 않았습니다.

+0

몇 가지 관찰. 두 번째 AppUserID 및 TenantID 필드의 데이터 형식은 무엇입니까? 그들은 int인가? (Nullable )? 둘째, 해당 외래 키 필드의 데이터 형식이 nullable이 아니기 때문에 두 관계의 TenantAdmin 쪽이 필수이고 선택이 아닌 것으로 표시되어서는 안됩니까? –

+0

DataTypes는 int입니다. 명시 적으로 TenantId와 AppUserId를 외래 키 (클래스를 꾸미거나 유창한 API를 사용하여)로 정의함으로써 해결되었습니다. 어떻게 든 "컨벤션 오버 컨벤션"은 그 일을 할 수 없었습니다. – BrilBroeder

답변

1
modelBuilder.Entity<TenantAdmin>().HasKey(x => new { x.TenantId, x.AppUserId }); 

외래 키는 어떨까요? 이미 외래 키 필드가 있다고 EF에 알리지는 않았습니다. 은 그래서 탐색 관계를 유지하기를 생성/이미 외래 키 필드가 다른 탐색 속성에 대한

modelBuilder.Entity<TenantAdmin>.HasRequired(t => t.Tenant) 
      .WithMany() 
      .HasForeignKey(fk => fk.TenantId) ; 

반복이야.

+0

Thx. 이것은 실제로 해결책이었습니다. 나는 컨벤션 오버 컨벤션이이 경우에 효과가 없었던 이유를 알지 못한다. – BrilBroeder

+0

주석 또는 유창 API를 사용하여이 필드가 외래 키라고 말할 수 있습니다. 컨벤션에 의해 이루어지지 않은 이유는 선택적 대 외래 키 문제 때문입니다. 그러나 그것은 EF 개발자들에게는 하나의 질문입니다. –

관련 문제