C# ObjectStateManager中已存在具有相同密钥的对象
无法将多对多属性保存到数据库 错误详细信息: ObjectStateManager中已存在具有相同密钥的对象。 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
[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);
}