UserManager更新用户记录,但也创建新记录

时间:2015-04-08 09:40:02

标签: c# asp.net-mvc entity-framework asp.net-mvc-5

我正在尝试更新2条记录:

  1. 用户记录(bool和自定义对象)
  2. 自定义对象(名为MoviesDB)
  3. 我正在使用UserManager:

    private UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
    

    ,代码是:

    using (ApplicationDbContext dbCtx = new ApplicationDbContext())
    {
        // user to update
        var user = UserManager.Users
                    .ToList()
                    .First(u => u.Id == User.Identity.GetUserId());
    
    
        // movie to update
        var movie = db.MoviesDBs.SingleOrDefault(m => m.ID == id);
    
        // this is the  only property i want to update
        movie.isRented = true;
    
        db.SaveChanges();
    
        // user update
        user.isRenting = true;
        user.MovieRented = movie;
    
        // this line creates a new movie record for some reason
        UserManager.Update(user);
    }
    

    正如您在我的评论中所看到的,最后一行代码:

    UserManager.Update(user);
    

    正在更新用户记录,但也会在数据库中创建一个我不想要的新电影记录。

    我想要的只是更新现有的电影记录和现有的用户记录。

1 个答案:

答案 0 :(得分:2)

问题是您使用的是两个数据库上下文:一个用于UserManager,另一个用于数据。

如果你想操纵user字段,必须在同一个数据库环境中完成:

using (ApplicationDbContext dbCtx = new ApplicationDbContext())
{
    // use the same context for the UserManager
    UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(dbCtx));
    // user to update
    var user = UserManager.Users
        .ToList()
        .First(u => u.Id == User.Identity.GetUserId());

    // movie to update
    var movie = dbCtx.Movies.SingleOrDefault(m => m.Name == "Star Wars");

    // this is the  only property i want to update
    movie.IsRented = true;

    dbCtx.SaveChanges();

    // user update
    user.IsRenting = true;
    user.MovieRented = movie;

    // this is should do the trick
    UserManager.Update(user);
}

当您使用单独的数据库连接时,EF认为电影对象是新的(如果不属于用户管理器的数据库上下文)