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

时间:2014-12-02 12:50:17

标签: c# entity-framework many-to-many

我有以下实体类/模型。

 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 .....与样品将不胜感激。谷歌到目前为止没有带给我我想要的东西。

1 个答案:

答案 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) ;

重复已有外键字段的其他导航属性。