多対多のプロパティをデータベース に保存することはできません。
エラーの詳細:
同じキーを持つオブジェクトは、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
--- _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");
});
更新、ここにある新しいコードは機能しますが、argrole
の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();
}