C# 使用实体框架检测相关表中的更改,并执行适当的插入和删除操作
假设我有一个C# 使用实体框架检测相关表中的更改,并执行适当的插入和删除操作,c#,linq,entity-framework-4,C#,Linq,Entity Framework 4,假设我有一个Person表,一个Role表,其中有一个trel表PersonRoles将它们尽可能多地链接起来 我创建了一个新人,并将其分配给两个角色(角色1、角色3) 然后我想编辑这个人;因此,我检索他们的数据并将他们的角色绑定到复选框。我更改了这些值(取消选择角色1,改为选择角色2),然后通过viewmodel发回这些数据 然后,我是否可以让Entity Framework为我更新这些角色,如在角色1中删除PersonRoles中的条目,然后添加一个新条目作为角色2?还是我必须自己来做这个逻
Person
表,一个Role
表,其中有一个trel表PersonRoles
将它们尽可能多地链接起来
我创建了一个新人,并将其分配给两个角色(角色1、角色3)
然后我想编辑这个人;因此,我检索他们的数据并将他们的角色绑定到复选框。我更改了这些值(取消选择角色1,改为选择角色2),然后通过viewmodel发回这些数据
然后,我是否可以让Entity Framework为我更新这些角色,如在角色1中删除PersonRoles
中的条目,然后添加一个新条目作为角色2?还是我必须自己来做这个逻辑
类似于**这个**我希望如此,但显然不起作用
[HttpPost]
public ActionResult Edit(int id, PersonViewModel model)
{
if (ModelState.IsValid)
{
var person= GetPerson(id);
person.Name= model.Name;
person.Age = model.Age;
ICollection<Roles> personroles = new Collection<Roles>();
foreach (string rId in model.Roles)
{
personroles.Add(this.RoleRepository.Single(r => r.Id.ToString() == rId));
}
**person.Roles = personroles;**
this.PersonRepository.SaveChanges();
return RedirectToIndex(personId);
}
return View();
}
[HttpPost]
公共操作结果编辑(int-id,PersonViewModel)
{
if(ModelState.IsValid)
{
var person=GetPerson(id);
person.Name=model.Name;
person.Age=model.Age;
ICollection personroles=新集合();
foreach(model.Roles中的字符串rId)
{
Add(this.rolerepositional.Single(r=>r.Id.ToString()==rId));
}
**person.Roles=personroles**
this.PersonRepository.SaveChanges();
返回重定向索引(personId);
}
返回视图();
}
干杯,
科汉魔鬼在细节中,你不会给出任何细节,但一般来说,是的,EF可以做到这一点 最好的方法是使
PersonRoles
只有两列:FKs toPerson
和Role
,在这两列上都有级联删除,并使PK在这两列上都是复合键。如果没有其他列,EF会将该表包含到一个多对多关系中,该关系的行为方式与您期望的相同
更新:既然您现在已经添加了源代码,那么让我们来修复它(未经测试;这是我不知道的):
我已经添加了一些代码,这是我希望做的,但我是否需要做更多的工作才能让它工作?我的表结构是按照您描述的那样实现的。啊,好吧,这就是我添加自己的逻辑的意思。我希望通过尝试将person.Roles设置为一个新的IEnumerable角色,它可以自己进行比较,看看需要添加什么、删除什么,然后自己操作这些插入。如果这意味着正如你在那里展示的那样,我必须自己做这些检查,那就是我将采取的路线。再次感谢。(呵呵,你似乎总是回答我的问题。)。
if (ModelState.IsValid)
{
var person= GetPerson(id);
person.Name= model.Name;
person.Age = model.Age;
var rolesToAdd = model.Roles.Where(mr => !person.Roles.Any(pr => pr.Id == mr);
var rolesToRemove = person.Roles.Where(pr => !model.Roles.Any(mr => pr.Id == mr);
foreach (string rId in rolesToAdd)
{
person.Roles.Add(this.RoleRepository.Single(r => r.Id.ToString() == rId));
}
foreach (string rrId in rolesToRemove)
{
var remove = person.Roles.Where(r => r.Id == rrId).Single();
person.Roles.Remove(remove);
}
this.PersonRepository.SaveChanges();
return RedirectToIndex(personId);
}