试图将MVC实体框架应用程序中的逻辑与控制器分离-这里发生了什么?
本文关键字:分离 控制器 这里 什么 发生了 MVC 实体 框架 应用程序 | 更新日期: 2023-09-27 18:11:40
根据我的上一个问题,我已经尝试将业务逻辑与控制器完全分离。
然而,这留下了一个问题,我明白为什么,但不是如何解决....而且,我不明白为什么它在做它正在做的事情。
在我的控制器中,我有以下内容:
public User GetCurrentUser()
{
User user = db.Users.SingleOrDefault(x => x.UserName == User.Identity.Name);
return user;
}
我现在知道[NonAction]
修复了安全问题-然而,我知道这并没有遵循在控制器中没有任何非控制器东西的最佳实践。出于这个原因,我转移到一个新类,并将其修改如下:
public User GetCurrentUser(string name)
{
User user = db.Users.SingleOrDefault(x => x.UserName == name);
return user;
}
我有一个编辑方法,之前简单地在用户对象中设置各种字段,然后称为db.SaveChanges()
。然而,这现在引起了问题-我相信这是由于调用db
对象上的命令,实际上没有加载对象。
但是,我真正不理解的部分是当我被重定向回主页并再次执行GetCurrentUser()
时,我看到了我更改的编辑细节…这些不存储在数据库中,只有当我重新启动应用程序时,它才返回到数据库结果。
我发现这很令人困惑!这里发生了什么,对象存储在哪里?
我该如何修复它?我试过使新类的db函数公开并调用它的SaveChanges()
方法,但是,这导致了同样的问题-数据没有被保存到数据库。
无论如何,坦率地说,我真的很喜欢通过GetCurrentUser()
调用它,我想要这是因为我想改变未来用户加载的方式-但是,现在我必须通过GetCurrentUser(User.Identity.Name)
调用它,并进行其他修改,我认为跳过方法并直接调用Lambda查询不会那么困难…这似乎可以省去很多麻烦。
根据你的问题的细节,你需要确保你附加你的实体对象,例如db.Users.Attach(updatedUser)
然后改变它的状态例:db.ObjectStateManager.ChangeObjectState(updatedUser, EntityState.Modified)
呼叫db.SaveChanges()
前
我为我的MVC应用程序编写的编辑函数通常在我调用SaveChanges之前还有一行代码:
_db.ApplyCurrentValues(OriginalEntity.EntityKey.EntitySetName, NewEntity);
_db.SaveChanges();
另外,也许我错过了一些东西,但这不是一个更简单的方法来更新数据库中的用户信息吗?
Membership.UpdateUser();
至于非数据库数据仍然为您显示的原因,我认为这是因为当您调用GetCurrentUser时,它在客户端缓存信息。我相信这里有经验的人可以给出更详细(或更正确)的答案。