簡體   English   中英

具有相同鍵的對象已存在於ObjectStateManager中

[英]An object with the same key already exists in the ObjectStateManager

無法將多對多屬性保存到數據庫。

錯誤詳情:

具有相同鍵的對象已存在於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桌

userRole permissionsInRoles userRole permission

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)
);

在db-context中:

        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");
            });

更新后,此處的新代碼可以使用,但似乎已連接,因為arg rolepermissions屬性為empty

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();
        }

name field是權限表中的唯一字段嗎?
如果是,那么顯然您不能授予與先前name相同的新權限,這就是您正在做的事情。
編輯:-您不能只添加從數據庫中獲取的權限
我的意思是確實真的有必要創建新的權限
像這樣的東西

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

從數據庫中檢索的modefy代碼然后工作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM