具有新/修改对象的上下文上的SaveChanges()不会';Don’我什么都不做
本文关键字:Don 什么 不会 修改 对象 上下文 SaveChanges | 更新日期: 2023-09-27 18:01:00
我曾经有一个用于ASP.NET网站的WORKING数据库,直到我了解到在整个应用程序生命周期中使用静态数据库上下文对象是一种非常糟糕的做法。
所以,一开始,我用这个:
public class Database
{
MainDBContainer db;
static Database()
{
db = new MainDBContainer();
}
}
internal static SiteUser GetUser(string username)
{
return db.SiteUserSet.SingleOrDefault(u => u.Username == username);
}
而且,正如您可能猜到的,我一直使用这个静态对象来访问/修改数据库。好吧,因为我到处都读到了(静态数据库上下文不好(,我决定把代码改为:
internal static SiteUser GetUser(string username)
{
//notice no static constructor for class.
using (MainDBContainer db = new MainDBContainer())
{
return db.SiteUserSet.SingleOrDefault(u => u.Username == username);
}
}
这个代码的问题(不是特别的"这个"代码,而是修改一些东西的代码。我的意思是,我用using关键字包装了每个数据库访问,就像这个一样(,调用了when db.SaveChanges()
,它没有抛出任何异常,但也没有发生任何事。在相同的上下文中,一切都可以工作,但仅此而已。没有任何内容被写入实际的SQL数据库以前,我已经设置好了所有内容并使其正常工作,一旦调用SaveChanges()
,所有内容都会立即刷新到数据库中。我的用户身份验证甚至被破坏了(很简单:客户端发送用户名/密码散列,如果它的正确服务器发送一个随机令牌,而客户端在每个请求中都使用令牌(:用户调用登录方法并成功地获得了一个令牌,但每当任何其他代码从另一个上下文与user对象交互时,该令牌就是DB以前拥有的任何令牌,登录方法中的CCD_ 3没有影响。所有方法都是一样的,我只是举了Login一个简单的例子。我是不是错过了什么?移植代码时是否遗漏了一些明显的内容?可能是的,但它是什么?
谢谢,可以
您已经移动到一个断开连接的模型。当上下文被破坏时,当您在下一次CRUD操作中创建新实例时,EF不再知道哪些对象是关联的。从本质上讲,您必须手动告诉EF您想要持久化的对象,以及如何持久化它们。
为了保存,您需要在上下文中调用AddObject
。
要进行更新,请调用AttachTo
,然后在ObjectStateManager
上调用ChangeObjectState
或SetModifiedProperty
。(注意:这只适用于完全断开连接的对象:如果您加载一个对象,然后进行更改(如果您正在进行行级版本控制,则可能会这样做(,EF已经知道该做什么,因为它有一个内置的更改跟踪机制,但仅当对象连接时。(
要删除,请先调用AttachTo
,然后调用DeleteObject
。