我有一个名为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");
}
答案 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();
}