2012-03-22 13 views
16

pracuję nad mvc projektu wzorkiem repozytorium i Entity Framework, teraz na moim formularzu mam model przykładowyEntityFramework zmiana model częściowy

SampleModel
1) imię i nazwisko
2) wiek
3) adres
4) zauważa
5) data aktualizowane

jestem wyświetlając jedynie następujące dane w formularzu edycyjnym
1) Nazwa
2) wiek
3) adres

teraz jeśli mogę zaktualizować model z brakujących wartości nieruchomości przy użyciu repozytorium, notatki, pola dateupdated idzie zerowa.

Moje pytanie brzmi: jak zaktualizować tylko kilka wybranych właściwości przy użyciu repozytorium (tryupdatemodel niedostępne w repozytorium) i nie chcę wywoływać oryginalnego obiektu i mapować właściwości ze zaktualizowanym modelem.

Czy jest jakiś sposób, musi być.

Odpowiedz

21

można aktualizować tylko podzbiór pól:

using (var context = new YourDbContext()) 
{ 
    context.SamepleModels.Attach(sampleModel); 

    DbEntityEntry<SameplModel> entry = context.Entry(sampleModel); 
    entry.Property(e => e.Name).IsModified = true; 
    entry.Property(e => e.Age).IsModified = true; 
    entry.Property(e => e.Address).IsModified = true; 

    context.SaveChanges(); 
} 

lub w ObjectContext API:

using (var context = new YourObjectContext()) 
{ 
    context.SamepleModels.Attach(sampleModel); 

    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sampleModel); 
    entry.SetModifiedProperty("Name"); 
    entry.SetModifiedProperty("Age"); 
    entry.SetModifiedProperty("Address"); 

    context.SaveChanges(); 
} 
+0

ohh ok lub napisać sql zapytania w celu zaktualizowania, prawda? lub napisz ogólny helper, aby zaznaczyć edytowane właściwości, humm ... to właśnie musi robić TryUpdate. – Milan

+0

Pozycja() nie istnieje w wersji EF 4.0. – Suncat2000

+1

@ Suncat2000: Drugi przykład dotyczy EF 4.0, pierwszy dotyczy wersji EF 4.1 i nowszych. –

1

Jest to stary wątek, ale jeśli ktoś jest zainteresowany, aby rozszerzyć na rozwiązaniach Ladislav, w my wymyślić pomocną metodę rozszerzenia dla wersji EF 4.1 i nowszej:

public static void SetModified<TEntity>(
     this DbEntityEntry<TEntity> entry, 
     IEnumerable<Expression<Func<TEntity, object>>> expressions) where TEntity : class, IEntity 
    { 
     foreach (var expression in expressions) 
      entry.Property(expression).IsModified = true; 
    } 

Oczywiście y Będziesz musiał usunąć ograniczenie IEntity, chyba że używasz interfejsu o tej samej nazwie dla swoich POCO.

Przykład użycia byłoby:

 var user = new User 
     { 
      Id = Request.Id, 
      UserName = Request.UserName, 
      FirstName = Request.FirstName 
     }; 

     var expressions = new List<Expression<Func<User, object>>> 
       { 
        x => x.UserName, 
        x => x.FirstName 
       }; 

     context.Entry(user).SetModified(expressions); 
Powiązane problemy