我想向用户添加一些xp。
string username = User.Identity.GetUserName();
var user = db.Users.First(u => u.UserName == username);
GameLogic.AddXp(99, user);
这是添加和保存xp的方法:
public void AddXp(int xp, ApplicationUser user)
{
user.Xp += xp;
db.SaveChanges();
}
但是这不会将xp保存到数据库中。
这是我的ApplicationUser
课程:
public class ApplicationUser : IdentityUser
{
public int Xp { get; set; }
这是我的ApplicationDbContext
课程:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
Database.Log = s => Debug.WriteLine(s);
}
public DbSet<Question> Questions { get; set; }
public DbSet<Answer> Answers { get; set; }
public DbSet<CurrentMatch> CurrentMatches { get; set; }
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
答案 0 :(得分:1)
如果用户已登录,则意味着用户实体已被跟踪,因此当您调用db.Users.First(...)时; EF为同一用户创建了另一个跟踪实例,这就是您获得异常的原因&#34; IEntityChangeTracker的多个实例无法引用实体对象&#34;。
解决它只需为用户dbSet调用AsNoTracking(),如下所示:
var user = db.Users.AsNoTracking().First(u => u.UserName == username);
然后修改AddXp方法,如下所示:
public void AddXp(int xp, ApplicationUser user)
{
user.Xp += xp;
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
}
答案 1 :(得分:0)
尝试使用此方法更新实体。
public void AddXp(int xp, ApplicationUser user)
{
user.Xp += xp;
// Mark the entity as modified
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
}