我有一个像这样的简单表:
巫婆有N:M的关系用户(Id,FirstName,...)< ===>角色(身份证,头衔,......)
我想要做的是通过拥有ID来删除它们之间的关系,所以我的方法应该是这样的:
public void UnlinkUsersFromRoles(int[] roleIds, int[] userIds)
{
var myContext = new DefaultContext();
// ?? <= how to break the relation without loading unnecessary columns
}
答案 0 :(得分:0)
你能做到这一点:
var rolesToRemove = myContext.Roles.Where(r=> roleIds.Contains(r.Id)).ToArray();
foreach(var user in myContext.Users.Where(u=> userIds.Contains(u.Id)){
forearch(var var role in rolesToRemove) {
user.Roles.Remove(role);
}
}
myContext.SaveChanges();
当你说:
如何在不加载不必要的列的情况下打破关系
你的意思是,上面的代码并不能满足你的要求吗?
编辑:
如果您有像UserInRoles这样的明确关系类,您应该使用John Castleman Answer,或者只创建一个,映射ForeignKeys并使用他的解决方案。
答案 1 :(得分:0)
如果这是多对多关系,则必须在它们之间有一个连接表:对于这些表User
和Role
,假设它被称为UserRole
,并且是简单连接表(即,该表上没有其他列,除了其他两个表的FK ID):
public class UserRole
{
public int UserId { get; set; }
public int RoleId { get; set; }
}
使用明确定义的连接表,UnlinkUsersFromRoles
可以定义如下:
public void UnlinkUsersFromRoles(int[] roleIds, int[] userIds)
{
using (var context = new DefaultContext())
{
foreach (var ur in context.UserRoles
.Where(u => userIds.Contains(u.UserId))
.Where(r => roleIds.Contains(r.RoleId))
.ToArray())
{
context.UserRoles.Remove(ur);
}
context.SaveChanges();
}
}
当您致电UserRole
时,您肯定会最终加载要删除的所有ToArray
行,但这肯定比加载所有相关User
和Role
行。