EF 在多对多关系中添加不需要的字段

本文关键字:不需要 添加 字段 关系 EF | 更新日期: 2023-09-27 18:32:43

我有以下实体类/模型。

 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 }); 
    ...
}

对多关系工作正常,数据库具有我期望的字段、键/键。当我删除应用程序用户时,我收到错误(这是意料之中的(,我应该在链接上配置级联删除。

我在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);

我想完成什么?能够自由创建应用程序用户,租户,而无需任何租户管理员。仅当相应的应用用户和租户存在时,才创建租户管理员。删除应用用户时,将删除所有关联的租户管理员(与删除租户时相同(。什么是"这样做的最佳实践"?

任何链接到一个好的 en 完整的解释 .带可选 .必填。。。。。有样品将不胜感激。到目前为止,谷歌并没有给我带来我想要的东西。

EF 在多对多关系中添加不需要的字段

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

但是外键呢?您没有告诉 EF 你已经有外键字段。所以它生成了一个来保存导航关系

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

对已具有外键字段的其他导航属性重复此操作。