1

我有一个 .Net Mvc 项目,我的 Databasecontext 有问题。更具体的更新/保存更改。当我在方法(如下)中使用调试点调试代码时,它可以正常工作,但并非没有调试点。我不明白为什么?不知何故,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;
    }

如果有人能指出我正确的方向,我将不胜感激

4

1 回答 1

2

快进快出(这就是甘道夫在一部电影中所说的...... :)我认为)。

我的意思是,如果某个虔诚的观察者坐在 CPU 中看着你的应用程序,他们应该看到的是你的应用程序运行以下顺序

{ 连接、创建上下文、进行更改、提交、销毁上下文、断开连接}

对于(几乎)它收到的每个 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)。

如果不是这种情况,则不必担心与数据库的并发连接。对上下文的并发访问更难管理。

于 2013-03-01T14:47:00.117 回答