Проблема с проверкой исходной записи базы данных отредактированной - PullRequest
1 голос
/ 12 сентября 2011

У меня проблемы с сохранением записей базы данных с использованием Linq в Visual Studio 2010 и SQL Server 2008. Моя проблема в том, что при редактировании некоторых записей я иногда проверяю исходную запись базы данных в целях проверки, кажется, что обновляется только исходная записьв режиме реального времени - т. е. это уже точно так же, как отредактированная запись, до того, как я отправил изменения!

Может ли кто-нибудь предложить эффективный способ справиться с этим?Я пытался использовать 2-е подключение к базе данных или 2-й репозиторий данных для вызова исходной записи из БД, но, похоже, она уже изменилась при отладке.

public void SaveobjectEdit(object objectToEdit)
{ 
    object originalObject = GetobjectById(objectToEdit.Id); 
    if (originalObject.objectStatus !=  objectToEdit.objectStatus) 
    { 
        originalObject.objectStatus = objectToEdit.objectStatus; 
    }
SaveChanges(); 
}

При сохранении изменений просто вызывается _db.SubmitChanges();кстати


Ни у кого нет идей по вышеуказанному вопросу?

Надеюсь, я был ясен - в целях проверки я хотел бы сравнить исходную запись базы данных с той, котораяЯ редактируюПроблема в том, что когда я редактирую запись, а затем пытаюсь извлечь исходную запись перед сохранением - исходная запись точно такая же, как и отредактированная запись.

1 Ответ

2 голосов
/ 20 сентября 2011

Если вы пытаетесь получить исходную запись в коде, из того же «контекста» , используя тот же метод доступа, тогда он будет содержать обновленный объект. Вместо того, чтобы спрашивать, зачем вы это делаете или чего пытаетесь достичь, я вместо этого объясню, как я понимаю, как работает контекст данных / контекст объекта (очень свободно и расплывчато).

Контекст - это что-то вроде представления вашей базы данных в памяти, где все загружено лениво. Когда вы создаете экземпляр контекста, вы получаете объект, который представляет вашу модель данных (конечно, это может быть представление не 1-1, и может содержать различные абстракции). Ничто не загружается в контекст, пока это не необходимо; любые запросы, которые вы пишете, остаются в качестве запросов, пока вы не посмотрите на их результаты. Когда вы получаете доступ к элементу (например, GetobjectById(objectToEdit.Id)), элемент загружается в контекст из базы данных, и вы можете get и set его свойства на досуге.

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

Способ обновить объекты в памяти - это вызвать метод Refresh в контексте. Попробуйте этот тест:

using (var db = new MyObjectContext())
{
    var item = db.Items.First();

    item.Name = "testing this thing";
    Console.WriteLine(db.Shifts.First().Name);

    db.Refresh(System.Data.Objects.RefreshMode.StoreWins, db.Items);
    Console.WriteLine(db.Shifts.First().Name);
}

Я полагаю, что этот шаблон имеет большой смысл, и я не уверен, что он мог бы работать по-другому. Учтите это:

foreach (var item in db.Items)
{
    item.Name = "test";
}

Assert(db.Items.All(item => item.Name == "test"));

Хотели бы вы, чтобы Assert потерпел неудачу? Должны ли эти предметы быть перезагружены? Я не верю в это. Я смотрю на элементы в моем контексте, а не в базе данных. Я не проверяю, были ли обновлены элементы в базе данных, но вместо этого я обновил все элементы в контексте моего кода.

Это хорошая причина, по которой я не использую MyObjectContext db - это , а не a 'db' или соединение с базой данных. Это контекст, в котором я могу изменить все, что захочу, поэтому я называю это так: MyObjectContext context.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...