我有一个带有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; }
}
答案 0 :(得分:2)
要在子项目中应用更改,您还需要获取它们。如果不在查询中包含子项,则EF不会跟踪子项目FK的更改,因此您的更改不适用。要解决此问题,只需在查询中包含用户:
var updated = _db.someModel.Include(f => f.someUser).First<Model>(f => f.Id == value.Id);