2013-01-31 1 views
8

У меня есть этот объект, необходимо обновить с помощью entityframeworkКак обновить только измененные значения (EntityFramework 5.0)?

EmployeeModel employee = new EmployeeModel 
    { 
     Id = 1000, //This one must 
     FirstName = modifiedValue, 
     Email = modifiedValue, 
     LastName = originalValue, 
     Phone = originalValue 
    }; 

код для обновления

_db.ObjectStateManager.ChangeObjectState(employee, EntityState.Modified); 
_db.SaveChanges(); 

Это SQL заявление получил в обновленном

Update Employee set Id=1138,FirstName='modifiedValue',Email='modifiedValue',LastName= 'OriginalValue',phone='originalValue' where Id=1138 

Но я ожидал этого

Update Employee set FirstName='modifiedValue', Email='modifiedValue' where Id=1138. 

Я не знаю, чего здесь не хватает. Пожалуйста, дайте мне знать.

+0

Возможный дубликат http://stackoverflow.com/questions/3642371/how-to-update-only-one-field-using-entity-framework – zsong

+0

Sza, Этот пост обновляется только в одном поле. – sivaL

+0

Вы можете расширить его, чтобы обновить несколько полей, следуя идее, опубликованной в этом вопросе. – zsong

ответ

6

Это решение, которое я получил

var entity = _db.CreateObjectSet<Employee>(); 
entity.Detach(employee); 
entity.Attach(employee); 

foreach (string modifiedPro in employeeModel.ModifiedProperties){ 
    _db.ObjectStateManager.GetObjectStateEntry(employee).SetModifiedProperty(modifiedPro);} 

    _db.SaveChanges(); 

только измененные значения в заявлении обновления SQL

Update Employee set FirstName='modifiedValue', Email='modifiedValue' where Id=1138. 

Если кто-нибудь знает лучший ответ, чем это, пожалуйста, напишите ваши предложения

8

Эта проблема является обычным явлением при работе с DTO. Объект сотрудника извлекается из базы данных, сопоставляется с DTO и отправляется по сети. Затем клиент модифицирует этот DTO и отправляет его обратно на сервер.

Когда вы касаетесь (устанавливаете) свойство на объекте EF, EF будет считать, что значение было изменено. Даже если старое значение и новое значение точно совпадают. Та же проблема возникает, когда вы сопоставляете DTO с новым Объектом и прикрепляете его к EF и обновляете его статус до «Изменено».

Использование AutoMapper:

// This will result in the full update statement 
var employee = AutoMapper.Mapper.Map<EmployeeDto, Employee>(dto); 

// This will result in a smaller update statement (only actual changes) 
var employee = dbContext.Employees.Find(dto.Id); 
AutoMapper.Mapper.Map(dto, employee); 

Или вручную (я избегаю делать это, но только ради полноты):

// This will result in a smaller update statement (only actual changes) 
var employee = dbContext.Employees.Find(dto.Id); 
if (employee.Email != dto.Email) 
    employee.Email = dto.Email; 

Есть, вероятно, некоторые другие способы для борьбы с этим проблема ... но использование AutoMapper вместе с Entity Framework правильно, безусловно, является одним из самых простых способов.

+0

отличное решение! благодаря! –

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

  • Нет связанных вопросов^_^