[英]An object with the same key already exists in the 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 role
的permissions
屬性為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.