2013-01-31 13 views
8

mam ten podmiot, chcesz zaktualizować przy użyciu entityframeworkJak aktualizować tylko zmodyfikowane wartości (EntityFramework 5.0)?

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

kod zaktualizować

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

Jest SQL got raz aktualizowany

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

Ale ja oczekuję tego

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

Nie wiem, czego tu brakuje. Proszę daj mi znać.

+0

Ewentualny duplikat http://stackoverflow.com/questions/3642371/how-to-update-only-one-field-using-entity-framework – zsong

+0

Sza, W tym miejscu zaktualizowano tylko jedno pole. – sivaL

+0

Można go rozszerzyć, aby zaktualizować wiele pól zgodnie z pomysłem opublikowanym w tym pytaniu. – zsong

Odpowiedz

6

To rozwiązanie mam

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(); 

tylko zmienione wartości w rachunku aktualizacji sql

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

Jeśli ktoś zna lepszej odpowiedzi niż ta, proszę zamieścić swoje propozycje

8

Ten problem jest powszechny w kontaktach z DTO. Jednostka pracownika jest pobierana z bazy danych, mapowana do DTO i przesyłana przez sieć. Klient następnie modyfikuje ten DTO i odsyła go do serwera.

Po dotknięciu (ustawieniu) właściwości na elemencie EF, EF przyjmie, że wartość została zmieniona. Nawet jeśli stara wartość i nowa wartość są dokładnie takie same. Ten sam problem pojawia się, gdy odwzorujesz DTO na jednostkę nowa i dołączasz ją do EF i aktualizujesz jej status na "Zmodyfikowany".

Korzystanie 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); 

Albo ręcznie (wolałbym uniknąć w ten sposób, ale tylko ze względu na kompletność):

// 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; 

prawdopodobnie istnieją jakieś inne sposoby radzenia sobie z tym problem ... ale używanie AutoMapper razem z Entity Framework jest zdecydowanie jednym z najprostszych sposobów.

+0

świetne rozwiązanie! dzięki! –

Powiązane problemy