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 完整的解释 .带可选 .必填。。。。。有样品将不胜感激。到目前为止,谷歌并没有给我带来我想要的东西。
modelBuilder.Entity<TenantAdmin>().HasKey(x => new { x.TenantId, x.AppUserId });
但是外键呢?您没有告诉 EF 你已经有外键字段。所以它生成了一个来保存导航关系
modelBuilder.Entity<TenantAdmin>.HasRequired(t => t.Tenant)
.WithMany()
.HasForeignKey(fk => fk.TenantId) ;
对已具有外键字段的其他导航属性重复此操作。