如何将值添加到用户的属性,然后将其保存到数据库?

时间:2016-08-26 09:59:45

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

我想向用户添加一些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();
        }
    }

2 个答案:

答案 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();
}