对象在上下文中不会更改

时间:2016-09-15 09:03:47

标签: c# linq linq-to-sql datacontext

使用Linq To Sql Classes不要更新上下文中的对象。 我正在使用Context获取一些记录并更新它们。

在我的数据库中,我有一条记录需要更新...

我得到它并更新了一个字段,但上下文中的对象不会改变。怎么可能? 我的代码如下:

using(myPersonalModelContext ctx = new myContext())
{
    List<LogIn> notProcessedLogins = ctx.LogIns.Where(login => login.processed == false).ToList(); //Returns 1 record. Ok.
    foreach (LogIn notProcessedLogin in notProcessedLogins)
    {
        notProcessedLogin.processed = true;
    }
    int notProcessedLoginsCounter = ctx.LogIns.Where(login => login.processed == false).Count(); //Returns 1!!!
    ctx.SubmitChanges(); //The object in the context has no change, so it doesn't update nothing.
    int notProcessedLoginsCounter = ctx.LogIns.Where(login => login.processed == false).Count(); //Returns 1!!!
}

我正在关注documentation example,看起来很琐碎,所以我不明白。有什么想法吗?

在自动生成的文件中,我看到正在正确更新_processed

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_processed", DbType="Bit")]
public System.Nullable<bool> processed
{
    get
    {
        return this._processed;
    }
    set
    {
        if ((this._processed != value))
        {
            this._processed = value;
        }
    }
}

我的印象是,我正在更新的对象由于某种原因与上下文分离。

1 个答案:

答案 0 :(得分:-2)

我知道原因。

当您调用ToList()时,它实际上会创建一个副本,因此您无需更改原始值。

尝试:

using(myPersonalModelContext ctx = new myContext())
{
    var notProcessedLogins = ctx.LogIns.Where(login => login.processed == false); 
    foreach (LogIn notProcessedLogin in notProcessedLogins)
    {
        notProcessedLogin.processed = true;
    }
    int notProcessedLoginsCounter = ctx.LogIns.Where(login => login.processed == false).Count(); 
    ctx.SubmitChanges(); 
    int notProcessedLoginsCounter = ctx.LogIns.Where(login => login.processed == false).Count();
}