实体框架多对多关系删除

时间:2014-11-12 17:18:49

标签: entity-framework entity-framework-6

我有一个名为User的类。它有一个名为Roles的财产。每个用户都有许多角色,每个角色都可以分配给许多用户。

该关系由第3表建立。我希望能够从用户中删除角色。但是,我两次调用数据库。一旦完全加载“用户”角色,一次加载角色。

var user =  this.Users.Include(f => f.Roles)
                  .SingleOrDefault(f => f.CustomerID == customerId && f.UserID == userId);
  if (user != null)
  {
    var role = user.Roles.FirstOrDefault(f => f.RoleID == roleId);
    if (role != null)
    {
      user.Roles.Remove(role);
      return this.SaveChanges() > 0;
    }
  }

我尝试过这样做,但它没有用。

var user = new User { CustomerID = customerId, UserID = userId };
this.Users.Attach(user);

var role = new Role { RoleID = roleId };
this.Roles.Attach(role);

user.Roles.Add(role);
user.Roles.Remove(role);

return this.SaveChanges() > 0;

我的上下文有DbSet<User>DbSet<Role>。我没有UserRole的一个,我不打算拥有它。

我做得对吗?我是否需要经常进行2次数据库通话?

- 用户类

[DataContract(Namespace = "urn:AES/Schemas/2014/09", IsReference = true)]
  public class User
  {
    .....

    [DataMember]
    public List<Role> Roles { get; set; }

    [DataMember]
    public bool Active { get; set; }
  }

映射

 this.HasMany(u => u.Roles)
  .WithMany()
  .Map(m =>
    {
      // The "left" key is the one specified in the HasMany method; the "right" key is the one specified in the WithMany method.
      m.MapLeftKey(new string[] { "CustomerID", "UserID" });
      m.MapRightKey("RoleID");
      m.ToTable("UserRoles");
    }
  );

  // Table & Column Mappings
  this.ToTable("Users");
}

1 个答案:

答案 0 :(得分:1)

好奇为什么你不对UserRoles这样的其他表进行建模,你只是懒惰吗? =)

但严重的是,你所做的很好但是对于大规模删除EF没有批量删除功能,你最好直接执行DELETE语句,如下所示:

using (System.Data.Common.DbCommand cmd = Context.Database.Connection.CreateCommand())
{
  cmd.CommandText = @"DELETE FROM Table WHERE KeyColumn = @Id";
  YourSqlHelper.AddParameter(cmd, "@Id", id);
  cmd.ExecuteNonQuery();
}