2016-07-30 4 views
0

Wenn es eine Einheit UserInfo genannt ist, ist UserId der Primärschlüssel, I definierte Einheit wie folgtwie einige Feld in ef aktualisieren

UserInfo userInfonew = new UserInfo() 
{ 
    UserId=userInfo.UserId, 
    Email = userInfo.Email, 
    FirstName = userInfo.FirstName, 
    LastName = userInfo.LastName, 
    LastUpdateBy = GetCurrentUserGuid(), 
    LastUpdate = DateTime.Now 
}; 

Wenn wir alle Objektfelder aktualisieren möchten, wir Verfahren haben als

folgt
db.Entry(userInfonew).State = EntityState.Modified; 

db.SaveChanges(); 

Wenn wir einige Felder aktualisieren möchten, zum Beispiel, wollen wir nur E-Mail-Feld aktualisieren:

db.UserInfoes.Attach(userInfonew); 

db.Entry(userInfonew).Property(x => x.Email).IsModified = true; 
db.SaveChanges(); 

Aber wenn es 20 Felder in dieser Entität gibt, wenn wir 18 Felder aktualisieren wollen, brauchen die zwei verbleibenden Felder keine Aktualisierung, wir müssen 18 mal über db.Entry(userInfonew).Property(x => x.field).IsModified = true schreiben, gibt es einen Weg darüber? Ich möchte nicht so oft darüber schreiben.

+1

Warum EF-Änderungsverfolgung nicht wie gewünscht verwenden? Fragen Sie den Benutzer ab, aktualisieren Sie alle Eigenschaften, die Sie benötigen, rufen Sie 'SaveChanges' auf. EF wird den Rest erledigen. –

+0

Wenn Sie die Änderungsverfolgung nicht verwenden können, können Sie den Entitätsstatus Ihres gesamten Eintrags auch auf Modifiziert setzen, wenn Sie noch die ursprünglichen Werte Ihres Eintrags haben. Wenn Sie nicht über Ihre Originaldaten verfügen und die generierte Abfrage so steuern möchten, dass nur die spezifischen Felder aktualisiert werden, müssen Sie jede Eigenschaft auf "Modified" setzen. – DevilSuichiro

Antwort

1

Wenn Sie keine Originaldaten von der Quelle erhalten und wenn Eigenschaften, die Sie nicht aktualisieren möchten, bekannt sind, können Sie tatsächlich Reflection verwenden, um zu erreichen, was Sie wollen. Was Sie tun müssen, ist eine Erweiterungsmethode erstellen (auch normale Methode sein kann, wenn man so bevorzugen), den Zustand der Eigenschaften, wie unten verändert:

public static void SetPropertiesToModeified<TEntity>(
    this MyContext context, 
    TEntity entity, 
    List<string> propertiesNotToUpdate) 
{ 
    // Get properties to update. Get all properties and 
    // exclude the ones you do not want to update. 
    List<string> propertiesToUpdate = typeof(TEntity) 
     .GetProperties()     
     .Select(m => m.Name)   
     .Except(propertiesNotToUpdate) // exculde propeties not update 
     .ToList(); 

    DbEntityEntry<TEntity> entry = context.Entry(entity); 
    propertiesToUpdate.ForEach(
     p => entry.Property(p).IsModified = true); 
} 

Dann können Sie sie mögen verwenden:

using(MyDbContext context = new MyDbContext()) 
{ 
    UserInfo userInfo = .....; 
    context.UserInfoes.Attach(userInfo); 
    List<string> propertiesNotToUpdate = new List<string> 
    { 
     "UserId", 
     "RegistrationDate" 
    }; 
    context.SetPropertiesToModeified(userInfo, propertiesNotToUpdate); 
    context.SaveChanges(); 
} 
Verwandte Themen