更新IdentityUser实体

时间:2018-02-15 11:36:37

标签: c# asp.net-mvc asp.net-identity

我已经为User:Identity类

创建了自定义字段
public class User : IdentityUser
{        
    public virtual ICollection<Item> Items { get; set; }      
}  

其中Item是自定义类

public class Item
{
    public Guid Id { get; set; }                
    public string OwnerId { get; set; }
    public string Name { get; set; }

    [ForeignKey("OwnerId")]
    public virtual User User { get; set; }    
}

然后我在控制器方法中使用它

    [HttpPost]
    public ActionResult AddToFavourite(bool check)
    {
        var user = UserManager.FindByIdAsync(User.Identity.GetUserId()).Result;
        var item = new Item();

        if (check)
            user.Items.Add(item);            
        else
            user.Items.Remove(item);

        _context.CommitChanges();

        return View();
    }

有人可以解释如何在数据库中保存这些更改吗? 我试图根据this实施解决方案,但不幸的是它仍然不适用于我。用户实体已更新,但数据库中未保存任何更改。

更新

public class ApplicationDbContext : IdentityDbContext<User>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    { }
    public DbSet<Item> Items { get; set; }      

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder); 
        modelBuilder.Entity<User>().HasMany(p => p.Items).WithMany().Map(mp => mp.ToTable("Favourite"));           
    }
}

public class Repository : IDisposable
{
    private ApplicationDbContext _dbContext = new ApplicationDbContext();

    public void CommitChanges() => _dbContext.SaveChanges();        

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                _dbContext.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

1 个答案:

答案 0 :(得分:0)

您需要实例化数据库连接。我假设您要么先关闭数据库的第一个路由或代码,然后设置连接。如果你转到你的web.config,你会看到连接字符串。

您可以使用'using语句'来实例化数据库连接,这将在using语句编译完成后处理连接。

using(var db = new DatabaseEntities())
{
    var user = UserManager.FindByIdAsync(User.Identity.GetUserId()).Result;
    var item = new Item();

    if (check)
        user.Items.Add(item);   
    else
        user.Items.Remove(item);



    db.SaveChanges();

}

但是,这不会将任何内容保存到数据库中,因为您的代码不会对数据库应用任何更改 - 您正在使用内存数据,例如user.items。