Используйте либо:
public bool SaveRecording(Recording recording)
{
// Load only the DateTime property, not the full entity
DateTime oldCreatedOn = db.Recordings
.Where(r => r.Id == recording.Id)
.Select(r => r.CreatedOn)
.SingleOrDefault();
recording.CreatedOn = oldCreatedOn;
db.Entry(recording).State = EntityState.Modified;
db.SaveChanges();
return true;
}
( Редактировать: Запрос загружает только столбец CreatedOn
из базы данных и поэтому дешевле и быстрее, чем загрузка полной сущности. Потому что вам нужно только свойство CreatedOn
с использованием Find
. ненужные накладные расходы: вы загружаете все свойства, но вам нужно только один из них. Кроме того, полная загрузка сущности с помощью Find
и последующее ее отсоединение могут быть сокращены с помощью AsNoTracking
: db.Recordings.AsNoTracking().SingleOrDefault(r => r.Id == recording.Id);
Это загружает объект, не присоединяя его, поэтому вам не нужно отсоединять объект. Использование AsNoTracking
также ускоряет загрузку объекта.)
Редактировать 2
Если вы хотите загрузить более одного свойства из базы данных, вы можете проецировать в анонимный тип:
public bool SaveRecording(Recording recording)
{
// Load only the needed properties, not the full entity
var originalData = db.Recordings
.Where(r => r.Id == recording.Id)
.Select(r => new
{
CreatedOn = r.CreatedOn,
CreatedBy = r.CreatedBy
// perhaps more fields...
})
.SingleOrDefault();
recording.CreatedOn = originalData.CreatedOn;
recording.CreatedBy = originalData.CreatedBy;
// perhaps more...
db.Entry(recording).State = EntityState.Modified;
db.SaveChanges();
return true;
}
(конец редактирования 2)
Или:
public bool SaveRecording(Recording recording)
{
Recording oldVersion = db.Recordings.Find(recording.Id);
recording.CreatedOn = oldVersion.CreatedOn;
// flag only properties as modified which did really change
db.Entry(oldVersion).CurrentValues.SetValues(recording);
db.SaveChanges();
return true;
}
( Редактировать: Использование CurrentValues.SetValues
помечает только измененные свойства, которые действительно были изменены по сравнению с исходным состоянием в базе данных. При вызове SaveChanges
EF будет отправлять только свойства, отмеченные как измененные в операторе UPDATE для базы данных. Принимая во внимание установку состояния в Modified
flags всех свойств как измененных, независимо от того, действительно ли они изменились или нет. Оператор UPDATE будет более дорогим, потому что он содержит обновление для все столбцы.)