我有以下实体类/模型。
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表中。即使我删除了双键定义并将一个Id属性添加到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和租户时才创建TenantAdmin。删除AppUser时,将删除所有关联的TenantAdmins(删除租户时相同)。这样做的最佳做法是什么?
任何链接到良好的完整解释.WithOptional .Required .....与样品将不胜感激。谷歌到目前为止没有带给我我想要的东西。
答案 0 :(得分:1)
modelBuilder.Entity<TenantAdmin>().HasKey(x => new { x.TenantId, x.AppUserId });
但外键怎么样?您没有告诉EF您已经拥有外键字段。 所以它生成一个来保存导航关系/ s
modelBuilder.Entity<TenantAdmin>.HasRequired(t => t.Tenant)
.WithMany()
.HasForeignKey(fk => fk.TenantId) ;
重复已有外键字段的其他导航属性。