我向数据库添加了3个角色。 "Admin"
,"Moderator"
和"User"
。我想简单地重命名
"Admin"
到"Administrator"
。我使用此代码,但它的工作不正确。它返回错误 {“数据库操作预计会影响1行但实际上影响了0行。数据可能已被修改或删除,因为实体已加载。请参阅http://go.microsoft.com/fwlink/?LinkId=527962了解有关理解的信息并处理乐观并发异常。“}
Edit.cshtml
@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Id)
<div>
Role name
</div>
<p>
@Html.TextBoxFor(model => model.Name)
</p>
<input type="submit" value="Save" />
}
RoleController
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(IdentityRole role) //IdentityRole role
{
try
{
context.Entry(role).State = EntityState.Modified;
context.SaveChanges();
return RedirectToAction("Index");
}
catch (Exception ex)
{
return View();
}
}
答案 0 :(得分:3)
使用Identity提供的角色管理器。
在Startup.Auth中,确保RoleManager的引用如下:
public void ConfigureAuth(IAppBuilder app)
{
// Add this reference
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
}
确保您的Controller包含此构造函数:
private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager { get { return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); } private set { _roleManager = value; } }
然后您可以使用此代替问题中的代码(以async形式给出):
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(IdentityRole role)
{
try
{
IdentityRole thisRole = await RoleManager.FindByIdAsync(role.Id);
thisRole.Name = role.Name;
await RoleManager.UpdateAsync(thisRole);
return RedirectToAction("Index");
}
catch (Exception ex)
{
return View();
}
}
最后确保你像这样处置角色管理器:
protected override void Dispose(bool disposing)
{
if (disposing && RoleManager != null)
{
RoleManager.Dispose();
RoleManager = null;
}
if (disposing)
{
context.Dispose();
}
base.Dispose(disposing);
}
希望这可以解决问题。
答案 1 :(得分:0)
这就是我的做法。我的管理页面的这一部分,选项:“添加/编辑角色”
[HttpPut]
public string UpdateRole(RoleModel roleModel)
{
string success = "";
using (var context = new ApplicationDbContext())
{
var roleStore = new RoleStore<IdentityRole>(context);
var storeManager = new RoleManager<IdentityRole>(roleStore);
IdentityRole thisRole = roleStore.Roles.Where(r => r.Id == roleModel.Id).FirstOrDefault();
if (thisRole != null)
{
thisRole.Name = roleModel.Name;
IdentityResult result = storeManager.Update(thisRole);
if(result.Succeeded)
success = "ok";
else
{
success = "ERROR";
foreach (string error in result.Errors)
{
success += " :" + error;
}
}
}
}
return success;
}
您必须使用特殊的RoleManager,我将它内置在ApplicationDbContext的using块中的storeManager中,以返回所有角色的列表。然后,我使用linq where子句查找所需的角色。然后,通过更改角色名称并调用.Update来修改角色,该更新也由roleStore StoreManager对象公开。 尝试直接编辑AspNet用户文件可以在EntityFramework中完成,除非将其用SQL搞乱,否则没有任何作用。