我有两个实体用户和角色
public partial class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public virtual ICollection<Role> Roles { get; set; }
}
public partial class Role
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<User> Users { get; set; }
}
我在数据库中有表(RoleUser)只包含userid和role id。 我想修改用户,删除RoleUser表中存在的行并插入新记录。 当我使用以下代码时,它会删除RoleUser Table中的行以及角色本身
public void Update(User usr)
{
var existingParent = _context.Users
.Where(p => p.Id == usr.Id)
.Include(p => p.Roles)
.SingleOrDefault();
if (existingParent != null)
{
// Update parent
_context.Entry(existingParent).CurrentValues.SetValues(usr);
// Delete children
foreach (var existingChild in existingParent.Roles.ToList())
{
if (!usr.Roles.Any(c => c.Id == existingChild.Id))
_context.Roles.Remove(existingChild);
}
}
}
问题是如何删除RoleUser Table中存在的记录并插入新记录而不删除实体本身?
答案 0 :(得分:1)
您需要执行此操作才能删除“多对多”表中的记录。让我知道它是否适合你。
IObjectContextAdapter contextAdapter = (IObjectContextAdapter)_context;
ObjectStateManager stateManager = contextAdapter.ObjectContext.ObjectStateManager;
stateManager.ChangeRelationshipState(existingParent, existingChild, "Roles", EntityState.Deleted);
_context.SaveChanges();
添加新值:
_context.Entry(existingParent).Collection("Roles").CurrentValue = values;
values
是您要添加的数据列表(应为IEnumerable
或ICollection
,因此List<Role>
可以)。
values
必须包含链接到数据库的对象。
foreach (Role entry in newValues) {
values.Add(_context.Set(typeof(Role)).Find(entry.Id));
}
答案 1 :(得分:1)
这是删除代码
_context.Users.find(userId).Roles.Remove(_context.Roles.find(roleId));
_context.SaveChange();
这是添加
的代码_context.Users.find(userId).Roles.Add(_context.Roles.find(roleId));
_context.SaveChange();
它会将userid和roleid保存到表多对多
希望帮助你