我正在尝试更新2条记录:
我正在使用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);
正在更新用户记录,但也会在数据库中创建一个我不想要的新电影记录。
我想要的只是更新现有的电影记录和现有的用户记录。
答案 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认为电影对象是新的(如果不属于用户管理器的数据库上下文)