Entity framework级联一对零或一对一关系

Entity framework cascade one to zero or one relationship

我有一个像下面这样的实体,

class User
    {
         public int Id {get;set;}
         public string Name {get;set;}

         public int? UserSecurityId {get;set;}
         public virtual UserSecurity UserSecurity {get;set;}

    }

class UserSecurity
{
  public int Id {get;set;}

  public int? AdminRoleId{get;set;}
  public virtual Admin AdminRole {get;set;}

  public int? ApproverRoleId {get;set;}
  public virtual TaskApprover ApproverRole {get;set;}
}

class Admin
{
  public int Id {get;set;}
  public string Name {get;set;}
}

class TaskApprover
{ 
   public int Id {get;set;}
   public string Name {get;set;}
}

我正在使用 entity framework 6.1.3 当我从 User table.

中删除用户时,我需要删除 UserSecurity 记录

搜索之后,我发现了这样的东西,

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //// Cascade delete, The foreign key table records will be removed when its parent deleted.
            modelBuilder.Entity<EPDUser>().HasOptional(x => x.UserSecurity).WithOptionalDependent().WillCascadeOnDelete(true);
            modelBuilder.Entity<EPDUserSecurity>().HasOptional(x => x.AdminRole).WithOptionalDependent().WillCascadeOnDelete(true);
            modelBuilder.Entity<EPDUserSecurity>().HasOptional(x => x.ApproverRole).WithOptionalDependent().WillCascadeOnDelete(true);
            base.OnModelCreating(modelBuilder);
        }

下面是我删除用户的存储库代码,

 protected override void OnDelete(int id)
            {

                var user = EntitySet.Include(x=>x.UserSecurity).FirstOrDefault(x => x.ID == id);
                EntitySet.Remove(user);
                DbContext.Entry(user).State = EntityState.Deleted;
            }

保存更改后,只会删除用户记录,不会删除 UserSecurity 记录。

Kinldy帮我在删除用户的时候删除了UserSecurity记录。 提前致谢

您正在将 EPDUser 配置为关系中的依赖实体。所以 EPDUser 有一个指向 EPDSecurity 的外键,如果你删除关联的 EPDSecurity 就会被删除,但反之则不然。您想要做的是使用 WithOptionalPrincipal,它将配置的实体设置为关系中的主体:

modelBuilder.Entity<EPDUser>()
    .HasOptional(x => x.UserSecurity)
    .WithOptionalPrincipal()
    .WillCascadeOnDelete(true);