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