Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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/2/.net/25.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# ObjectStateManager中已存在具有相同密钥的对象_C#_.net_Entity Framework_Many To Many - Fatal编程技术网

C# ObjectStateManager中已存在具有相同密钥的对象

C# ObjectStateManager中已存在具有相同密钥的对象,c#,.net,entity-framework,many-to-many,C#,.net,Entity Framework,Many To Many,无法将多对多属性保存到数据库 错误详细信息: ObjectStateManager中已存在具有相同密钥的对象。 ObjectStateManager无法跟踪具有相同属性的多个对象 钥匙 我已尝试在此操作方法中保存属性: [HttpPost] public ActionResult Edit(UserRole role) { var permissionNameList= (from per in _db.Permission

无法将多对多属性保存到数据库

错误详细信息:

ObjectStateManager中已存在具有相同密钥的对象。 ObjectStateManager无法跟踪具有相同属性的多个对象 钥匙

我已尝试在此操作方法中保存属性:

       [HttpPost]
        public ActionResult Edit(UserRole role)
        {
            var permissionNameList=  (from per in _db.Permissions
                                               select per.Name).Distinct().ToList();
            foreach(var name in permissionNameList)
            {
                role.Permissions.Add(new permission(name, oper));
            }

            if (ModelState.IsValid)
            {
                _db.Entry(role).State = System.Data.EntityState.Modified;
                _db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(role);
        }
数据库表结构如下所示:

3表

用户角色
-
权限角色
-
权限

CREATE TABLE newsmonitoringmanagement.permission
(
Id          INT NOT NULL auto_increment,
Name        VARCHAR (50) NOT NULL,
Description VARCHAR (250) NULL,
Operations  INT NOT NULL,
PRIMARY KEY (Id),
UNIQUE KEY UK_permissionIdentity (Name, Operations)
);
在数据库上下文中:

        modelBuilder.Entity<UserRole>()
            .HasMany(usrRole => usrRole.Permissions)
            .WithMany(permisn => permisn.Roles)
            .Map(m =>
            {
                m.ToTable("permissionsInRoles");
                m.MapLeftKey("RoleId");
                m.MapRightKey("PermissionId");
            });

        modelBuilder.Entity<Permission>()
            .HasMany(per => per.Roles)
            .WithMany(role => role.Permissions)
            .Map(m =>
            {
                m.ToTable("permissionsInRoles");
                m.MapLeftKey("PermissionId");
                m.MapRightKey("RoleId");
            });

名称字段
是权限表中唯一的字段吗?
如果是,则显然您不能使用与上一个相同的
名称创建新权限,这就是您正在做的。
编辑:-您不能按原样添加从数据库获得的权限吗
我的意思是,是否真的需要创建新的权限
类似这样的东西

var permissionList=  (from per in _db.Permissions
                                               select per).Distinct();

            foreach(var permission in permissionList)
            {

                var opert = Convert.ToInt32(Request.Form[name + "_op"]);
                //var per=new Permission();
                //per.Name=name;
                permmission.Operations=opert;
                role.Permissions.Add(permission);
            }

对从数据库中检索的代码进行调制,然后它就可以工作了

public ActionResult Edit(UserRole role)
{
    var permissionNameList = (from per in _db.Permissions
                              select per.Name).Distinct().ToList();
    var realRole = (from r in _db.UserRoles
                    where r.Id == role.Id
                    select r).First();

    foreach (var perm in realRole.Permissions)
    {
        var opert = Convert.ToInt32(Request.Form[perm.Name + "_op"]);
        if (perm.Name.InList(permissionNameList))
        {
            perm.Operations = opert;
        }
    }

    if (ModelState.IsValid)
    {
        _db.Entry(realRole).State = System.Data.EntityState.Modified;
        _db.SaveChanges();
    }

    this.TempData["msg"] = "[EditRolePermissions]Saved Role Id " + role.Id;
    return RedirectToAction("Details/" + role.Id);
}

请看我的更新。UNIQUE KEY UK_permissionIdentity(名称、操作)我已更改了
Operations
属性,因此我需要将所有这些内容保存回数据库。var opert=Convert.ToInt32(Request.Form[name+“_op]”);见我的编辑。。如果不需要创建新权限,则可以轻松编辑操作
public ActionResult Edit(UserRole role)
{
    var permissionNameList = (from per in _db.Permissions
                              select per.Name).Distinct().ToList();
    var realRole = (from r in _db.UserRoles
                    where r.Id == role.Id
                    select r).First();

    foreach (var perm in realRole.Permissions)
    {
        var opert = Convert.ToInt32(Request.Form[perm.Name + "_op"]);
        if (perm.Name.InList(permissionNameList))
        {
            perm.Operations = opert;
        }
    }

    if (ModelState.IsValid)
    {
        _db.Entry(realRole).State = System.Data.EntityState.Modified;
        _db.SaveChanges();
    }

    this.TempData["msg"] = "[EditRolePermissions]Saved Role Id " + role.Id;
    return RedirectToAction("Details/" + role.Id);
}