我有一个.Net Mvc projekt,我的Databasecontext有问题。更具体的更新/ saveChanges。当我在方法(下面)中使用调试点调试代码时,它接缝工作但不是没有调试点。我不明白为什么?不知何故,SaveChanges没有检测到对实体的更改。
var user = DatabaseContext.Users.Single(u => u.Id == userId && u.Newsdesk.Id == newsdeskId);
user.Newsdesk = null;
DatabaseContext.Update(user);
DatabaseContext.SaveChanges();
DatabaseContext中的我的更新方法如下所示:
public T Update<T>(T entity) where T : class
{
var set = Set<T>().Attach(entity);
Entry(entity).State = EntityState.Modified;
return set;
}
如果有人能指出我正确的方向,我将非常感激
答案 0 :(得分:2)
快速进入并迅速退出(这就是甘道夫在其中一部电影中所说的...... :) 我认为)。
我的意思是,如果一些敬虔的观察者坐在CPU里看着你的应用, 他们应该看到的是你的应用程序按以下顺序运行
{connect,create context,make changes,commit them,destroy context,disconnect}
(几乎)每个Web请求收到的数十毫秒。
您是否实际创建了一个上下文(实体容器+工作单元) 整个应用程序在全球范围内存在?
我建议采用更经典且不那么dbconnection友好的方法(更不用说交易消毒):
using (var context = DataContextHelper.CreateContext()) {
var user = DataContextHelper.QueryAndSingleByLambdaBasedOnContext(
context,
u => u.Id == userId && u.Newsdesk.Id == newsdeskId
);
if (null == user)
// complain somehow (by exception or special return value)
user.Newsdesk = null;
// don't mark it anymore, in the straight-forward, good'ol way
// user will already have been marked
//DatabaseContext.Update(user);
context.SaveChanges();
}
通常不好(特别是如果你不小心)以某种方式主持 一个全局可访问的上下文,多个线程可以同时使用。
我不是在谈论访问某些财产时的并发危险。
我说的是大局
(也许另一个请求读取用户并在某处将其标记为“未被修改”
在Update
和SaveChanges
之间。
如果情况并非如此,您不必担心与数据库的并发连接。 对上下文的并发访问更加难以管理。