Badałem różne metody edycji / aktualizacji rekordu w Entity Framework 5 w środowisku ASP.NET MVC3, ale jak dotąd żadne z nich nie zaznacza wszystkich wymaganych pól. Wyjaśnię dlaczego.
Znalazłem trzy metody, o których wspomnę za i przeciw:
Metoda 1 - Załaduj oryginalny rekord, zaktualizuj każdą właściwość
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
Plusy
- Można określić, które właściwości mają się zmienić
- Widoki nie muszą zawierać wszystkich właściwości
Cons
- 2 x zapytania do bazy danych, aby załadować oryginał, a następnie go zaktualizować
Metoda 2 - Załaduj oryginalny rekord, ustaw zmienione wartości
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
Plusy
- Tylko zmodyfikowane właściwości są wysyłane do bazy danych
Cons
- Widoki muszą zawierać każdą właściwość
- 2 x zapytania do bazy danych, aby załadować oryginał, a następnie go zaktualizować
Metoda 3 - Dołącz zaktualizowany rekord i ustaw stan na EntityState.Modified
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
Plusy
- 1 x zapytanie do bazy danych do aktualizacji
Cons
- Nie można określić, które właściwości mają się zmienić
- Widoki muszą zawierać każdą właściwość
Pytanie
Moje pytanie do was, chłopaki; Czy istnieje czysty sposób na osiągnięcie tego zestawu celów?
- Można określić, które właściwości mają się zmienić
- Widoki nie muszą zawierać wszystkich właściwości (takich jak hasło!)
- 1 x zapytanie do bazy danych do aktualizacji
Rozumiem, że jest to drobna rzecz, na którą należy zwrócić uwagę, ale może mi brakować prostego rozwiązania tego problemu. Jeśli nie metoda, zwycięży ;-)