다음 엔티티 클래스/모델이 있습니다.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은 내가 지금까지 찾고있는 것을 가져 오지 않았습니다.
몇 가지 관찰. 두 번째 AppUserID 및 TenantID 필드의 데이터 형식은 무엇입니까? 그들은 int인가? (Nullable)? 둘째, 해당 외래 키 필드의 데이터 형식이 nullable이 아니기 때문에 두 관계의 TenantAdmin 쪽이 필수이고 선택이 아닌 것으로 표시되어서는 안됩니까? –
DataTypes는 int입니다. 명시 적으로 TenantId와 AppUserId를 외래 키 (클래스를 꾸미거나 유창한 API를 사용하여)로 정의함으로써 해결되었습니다. 어떻게 든 "컨벤션 오버 컨벤션"은 그 일을 할 수 없었습니다. – BrilBroeder