MVC将ApplicationUser设置为null

时间:2015-09-22 14:59:31

标签: c# asp.net-mvc

我有一个带有ApplicationUser对象外键的模型,如下所示。

public virtual ApplicationUser someUser { get; set; }

我希望这可以为空,所以我可以像这样设置用户:

updated.someUser = _db.Users.Where(m => m.UserName == Context.User.Identity.Name).SingleOrDefault();

或者像这样删除它:

updated.someUser = null;

有趣的是,如果调试和步骤通过它工作。如果我只是运行它没有任何事情发生。 如果我在行之前检查对象,它会显示:

[System.Data.Entity.DynamicProxies.ApplicationUser_4AF71C23434370A1A8CFA22D42BB10C234BFFB0D2B04A796CF2893A0618F8D5E] = {System.Data.Entity.DynamicProxies.ApplicationUser_4AF71C23434370A1A8CFA22D42BB10C234BFFB0D2B04A796CF2893A0618F8D5E}

并且F11到下一行它正确设置:

updated.someUser = null

在保存更改后,我也会在数据库中看到这一点。 我将方法从异步任务更改为无效,看看这是否有帮助但是没有改变任何东西。如果重要的话,可以使用SignalR调用方法。

这里发生了什么?

**编辑****

方法。 在一个衬里有很多,但改变了它,使其更加明显。

 public void SomeMethod(ViewModel value)
 {
      var updated = _db.someModel.First<Model>(f => f.Id == value.Id);

      if (value.someBool)
      {
          updated.someUser = _db.Users.Where(m => m.UserName == Context.User.Identity.Name).SingleOrDefault();
          updated.someDate = DateTime.Now;
      }
      else 
      {
          updated.someUser = null;
          updated.someDate = null;
      }

      _db.SaveChanges();

      var returnData = new ViewModel()
      {
          // ....
      }
      Clients.All.someMethod(returnData, Context.ConnectionId);
}

_db来自同一类

private ApplicationDbContext _db = new ApplicationDbContext();

来自IdentityModels.cs

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

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

    public DbSet<Model> someModel { get; set; }
}

1 个答案:

答案 0 :(得分:2)

要在子项目中应用更改,您还需要获取它们。如果不在查询中包含子项,则EF不会跟踪子项目FK的更改,因此您的更改不适用。要解决此问题,只需在查询中包含用户:

var updated = _db.someModel.Include(f => f.someUser).First<Model>(f => f.Id == value.Id);
相关问题