Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架检测相关表中的更改,并执行适当的插入和删除操作_C#_Linq_Entity Framework 4 - Fatal编程技术网

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 to
Person
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);
    }