EF 4.3 多对多关系和联接表更新
本文关键字:更新 关系 EF | 更新日期: 2023-09-27 18:28:43
public class User
{
public int Id{ get; set; }
public ICollection<UserAction> UserActions{ get; set; }
public string Name{ get; set; }
}
public class Action
{
public int Id{ get; set; }
public string Name{ get; set; }
public ICollection<UserAction> UserActions{ get; set; }
}
public UserAction
{
public int Id{ get; set; }
public User User{ get; set; }
public Action Action{ get; set; }
public int Type {get;set}
}
和存储库类
public void Update(User user,List<UserAction> actions)
{
User entity = this.GetUser(user.Id);
entity.UserActions.Clear();
entity.UserActions= actions;
this.siteRepository.Update<SiteUser>(user);
this.siteRepository.UnitOfWork.SaveChanges();
}
我在下面得到一个错误,比如
操作失败:无法更改关系,因为一个或多个外键属性不可为空。对关系进行更改时,相关的外键属性将设置为 null 值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
如果要将数据库中现有的UserActions
集合替换为要传递到方法中的新集合,则需要这样的语义。特别是有必要从数据库中删除已从集合中删除的UserActions
,因为显然关系是必需的,并且用户操作必须引用用户实体,或者必须删除它们(这就是异常所说的(:
User entity = context.Users.Include(u => u.UserActions)
.Single(u => u.Id == user.Id);
context.Entry(entity).CurrentValues.SetValues(user);
foreach (var userAction in entity.UserActions.ToList())
if (!user.UserActions.Any(ua => ua.Id == userAction.Id))
context.UserActions.Remove(userAction); // DELETE is important here!
foreach (var userAction in user.UserActions)
{
var userActioninDB = entity.UserActions
.SingleOrDefault(ua => ua.Id == userAction.Id);
if (userActionInDB == null)
entity.UserActions.Add(userActioninDB);
else
context.Entry(userActioninDB).CurrentValues.SetValues(userAction);
}
context.SaveChanges();
您必须将其转换为存储库结构。
谢谢Slauma,解决方案是
List<UserAction> actions = new List<UserAction>(user.UserActions.ToList());
foreach (var action in actions )
{
Delete<UserAction>(action);
}
将
用户集合添加到操作类和将操作添加到用户。如果成对的用户和操作对于此表是唯一的,则甚至无法映射用户操作表。
我在这里回答了完全相同的答案:数据库优先使用桥接表,如何将其排除在模型之外