为什么SaveChanges没有检测到实体的变化?

时间:2013-03-01 14:34:46

标签: .net entity-framework ef-code-first

我有一个.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;
    }

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

1 个答案:

答案 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();
}

通常不好(特别是如果你不小心)以某种方式主持 一个全局可访问的上下文,多个线程可以同时使用。

我不是在谈论访问某些财产时的并发危险。 我说的是大局 (也许另一个请求读取用户并在某处将其标记为“未被修改” 在UpdateSaveChanges之间。

如果情况并非如此,您不必担心与数据库的并发连接。 对上下文的并发访问更加难以管理。