如何仅更新多对多导航属性?

Posted

技术标签:

【中文标题】如何仅更新多对多导航属性?【英文标题】:How to update many to many navigation property only? 【发布时间】:2011-08-15 17:47:13 【问题描述】:

我可以更新一些在方法下使用的属性

public void Update(T entity, params Expression<Func<T, object>>[] properties) 

    _dbSet.Attach(entity); 
    DbEntityEntry<T> entry = _context.Entry(entity);
    foreach (var selector in properties)  entry.Property(selector).IsModified = true; 

//repo.Update(entity, e => e.Name, e => e.Description);

但是,我只想在多对多关系中更新导航属性 比如 admin 角色 adminrole 我只想更新 adminrole 表

【问题讨论】:

【参考方案1】:

如果您只想更新关系,您可以使用简单的技巧。

要在管理员和角色之间添加新关系,您需要执行以下操作:

Admin admin = new Admin  Id = adminId ;
context.Admins.Attach(admin);
Role role = new Role  Id = roleId ;
context.Roles.Attach(role);
// Create new relation on attached entities
admin.Roles.Add(role);
context.SaveChanges();

要删除管理员和角色之间的现有关系,您可以尝试以下操作:

Admin admin = new Admin  Id = adminId ;
Role role = new Role  Id = roleId ;
// Simulate existing relation on detached entities
admin.Roles.Add(role);
context.Admins.Attach(admin);
// Remove existing relation on attached entities
admin.Roles.Remove(role);
context.SaveChanges();

在这两种情况下,您只需要知道管理员和角色的密钥。

注意:这适用于真正多对多的场景(联结表仅包含键)。

【讨论】:

SystemAdmin 实体 = base.GetByKey(admin.SAID); DbEntityEntry entry = base.DataContext.Entry(entity); entity.AdminRoles.Clear(); entry.Collection(a => a.AdminRoles).CurrentValue = admin.AdminRoles;

以上是关于如何仅更新多对多导航属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用代码优先实体框架在 ASP.Net MVC3 中重新加载多对多导航属性

EF更新多对多关系表中记录的时候,无法更新关系表的问题。

使用实体框架中的导航属性填充多对多关系表

多对多关系 - 如何更新数据透视表中的属性

无法获取多对多表属性的数据

反对 js:无法使用连接表额外属性更新多对多关系。说附加属性无效