C# 改变';用户';来自其他控制器的数据

C# 改变';用户';来自其他控制器的数据,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我一直在尝试从角色控制器中更新用户记录,并不断遇到许多错误。最新错误是以下异常: System.InvalidOperationException:'附加类型为'TRIZTools.Models.User'的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添

我一直在尝试从角色控制器中更新用户记录,并不断遇到许多错误。最新错误是以下异常:

System.InvalidOperationException:'附加类型为'TRIZTools.Models.User'的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”

这是代码的副本:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RoleAddToUser(string UserId, string RoleName)
    {
        User user = context.Users.Where(u => u.Id.Equals(UserId, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
        var userManager = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        ViewBag.RolesForThisUser = userManager.GetRoles(user.Id);
        var idResult = userManager.AddToRole(user.Id, RoleName);
        if (user.AccountNew)
        {
            user.AccountNew = false;
            userManager.Update(user);
        }

我没有看到
userManager.AddToRole
方法,但我怀疑您可能正在更新该方法中的另一个用户实体。因此,用户实体被标记为
EntityState.Modified
,您正在尝试更新另一个尚未更新的用户实体。因此,我们应该保存第一个实体,EF会将该实体标记为
EntityState。保持不变
,这样可能会解决问题。添加
context.SaveChanges()我修改了这样的方法

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RoleAddToUser(string UserId, string RoleName)
    {
        User user = context.Users.Where(u => u.Id.Equals(UserId, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
        var userManager = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        ViewBag.RolesForThisUser = userManager.GetRoles(user.Id);
        var idResult = userManager.AddToRole(user.Id, RoleName);
        context.SaveChanges(); // Add this line
        if (user.AccountNew)
        {
            user.AccountNew = false;
            userManager.Update(user);
        }
     }
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RoleAddToUser(字符串用户ID、字符串角色名)
{
User User=context.Users.Where(u=>u.Id.Equals(UserId,StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var userManager=newusermanager(newuserstore(newapplicationdbcontext());
ViewBag.RolesForThisUser=userManager.GetRoles(user.Id);
var idResult=userManager.AddToRole(user.Id,RoleName);
context.SaveChanges();//添加此行
if(user.AccountNew)
{
user.AccountNew=false;
userManager.Update(用户);
}
}

我没有看到
userManager.AddToRole
方法,但我怀疑您可能正在更新该方法中的另一个用户实体。因此,用户实体被标记为
EntityState.Modified
,您正在尝试更新另一个尚未更新的用户实体。因此,我们应该保存第一个实体,EF会将该实体标记为
EntityState。保持不变
,这样可能会解决问题。添加
context.SaveChanges()我修改了这样的方法

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RoleAddToUser(string UserId, string RoleName)
    {
        User user = context.Users.Where(u => u.Id.Equals(UserId, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
        var userManager = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        ViewBag.RolesForThisUser = userManager.GetRoles(user.Id);
        var idResult = userManager.AddToRole(user.Id, RoleName);
        context.SaveChanges(); // Add this line
        if (user.AccountNew)
        {
            user.AccountNew = false;
            userManager.Update(user);
        }
     }
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RoleAddToUser(字符串用户ID、字符串角色名)
{
User User=context.Users.Where(u=>u.Id.Equals(UserId,StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var userManager=newusermanager(newuserstore(newapplicationdbcontext());
ViewBag.RolesForThisUser=userManager.GetRoles(user.Id);
var idResult=userManager.AddToRole(user.Id,RoleName);
context.SaveChanges();//添加此行
if(user.AccountNew)
{
user.AccountNew=false;
userManager.Update(用户);
}
}
解决方案 在@Rainman的帮助下,以下是解决方案:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RoleAddToUser(string UserId, string RoleName)
    {
        User user = context.Users.Where(u => u.Id.Equals(UserId, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
        var userManager = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        ViewBag.RolesForThisUser = userManager.GetRoles(user.Id);
        var idResult = userManager.AddToRole(user.Id, RoleName);
        if (user.AccountNew)
        {
            user.AccountNew = false;
            context.SaveChanges(); //This fixed it!
        }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RoleAddToUser(string UserId, string RoleName)
    {
        User user = context.Users.Where(u => u.Id.Equals(UserId, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
        var userManager = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        ViewBag.RolesForThisUser = userManager.GetRoles(user.Id);
        var idResult = userManager.AddToRole(user.Id, RoleName);
        if (user.AccountNew)
        {
            user.AccountNew = false;
            context.SaveChanges(); //This fixed it!
        }
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RoleAddToUser(字符串用户ID、字符串角色名)
{
User User=context.Users.Where(u=>u.Id.Equals(UserId,StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var userManager=newusermanager(newuserstore(newapplicationdbcontext());
ViewBag.RolesForThisUser=userManager.GetRoles(user.Id);
var idResult=userManager.AddToRole(user.Id,RoleName);
if(user.AccountNew)
{
user.AccountNew=false;
context.SaveChanges();//这就解决了它!
}
解决方案 在@Rainman的帮助下,以下是解决方案:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RoleAddToUser(string UserId, string RoleName)
    {
        User user = context.Users.Where(u => u.Id.Equals(UserId, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
        var userManager = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        ViewBag.RolesForThisUser = userManager.GetRoles(user.Id);
        var idResult = userManager.AddToRole(user.Id, RoleName);
        if (user.AccountNew)
        {
            user.AccountNew = false;
            context.SaveChanges(); //This fixed it!
        }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RoleAddToUser(string UserId, string RoleName)
    {
        User user = context.Users.Where(u => u.Id.Equals(UserId, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
        var userManager = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        ViewBag.RolesForThisUser = userManager.GetRoles(user.Id);
        var idResult = userManager.AddToRole(user.Id, RoleName);
        if (user.AccountNew)
        {
            user.AccountNew = false;
            context.SaveChanges(); //This fixed it!
        }
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RoleAddToUser(字符串用户ID、字符串角色名)
{
User User=context.Users.Where(u=>u.Id.Equals(UserId,StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var userManager=newusermanager(newuserstore(newapplicationdbcontext());
ViewBag.RolesForThisUser=userManager.GetRoles(user.Id);
var idResult=userManager.AddToRole(user.Id,RoleName);
if(user.AccountNew)
{
user.AccountNew=false;
context.SaveChanges();//这就解决了它!
}

可能重复使用UserManager检索用户(UserManager.FindById())而不是“context.Users.Where()”。我认为问题在于您使用一个上下文检索用户,而使用一个完全不同的上下文更新用户。可能重复使用UserManager检索用户(UserManager.FindById())而不是“context.Users.Where()”。我认为问题是因为您使用了一个上下文来检索用户,而使用了一个完全不同的上下文来更新用户。很棒的工作@Rainman,这几乎成功了。但是,由于您的响应,我现在已经修复了它,因此,尽管您没有提供解决方案,但您为我提供了所需的帮助。我将解决方案放在IF sta中tement,而不是在主代码块中。好的,我看到了。我的错误。很棒的工作@Rainman,几乎成功了。但是,由于您的响应,我现在已经修复了它,所以尽管您没有提供解决方案,但您提供了我所需的帮助。我将解决方案放在IF语句中,而不是放在主代码块中。好的,我看到了。我的mi赌注。