2016-09-15 2 views
1

Использование Linq To Sql Classes не обновляет объект в контексте. Я использую контекст, чтобы получить некоторые записи и обновить их.Объект не изменяется в контексте

В моей БД у меня есть одна запись, которую я хочу обновить ...

я получаю его и я обновить поле, но объект в контексте не меняется. Как это возможно? Мой код выглядит следующим образом:

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

Вы не представили свои изменения в базу данных до второго запроса. – spender

+0

@spender, но это не объясняет, почему его все еще не изменилось. –

+0

@spender, счетчик просто должен показать, что контекст ничего не изменит. Все равно возвращает 1, если я снова сделаю запрос после подписок. Я обновил код. –

ответ

-2

Я знаю причину.

Когда вы вызываете ToList(), он фактически создает копию, поэтому вы ничего не изменили, чтобы изменить исходные значения.

Try:

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(); 
} 
+0

Создает копию со ссылками ... Удаление 'ToList()' mantains the behavior ... GoTo http://stackoverflow.com/questions/2774099/tolist-does-it-create-a-new-list –

+2

Интересное , для меня он использовал, чтобы не обновлять изменения. Возможно, поскольку я использую Entity Framework. Тем не менее, я приношу свои извинения за вводящий в заблуждение ответ, я попытаюсь найти другое решение. –

Смежные вопросы