2009-09-13 6 views
0

Je suis en train d'implémenter Repository Pattern avec l'infrastructure d'entité ADO.NET. Je vois que la mise à jour des enregistrements est relativement plus compliquée que l'ajout ou la suppression de la base de données. Voir ci-dessous la déclaration de mise à jour et ajouter une déclaration pour votre jugement.Avec le modèle Repository, quelle est la manière la plus efficace de mettre à jour les enregistrements?

Je me demandais s'il était possible de mettre à jour l'enregistrement sans devoir d'abord récupérer l'enregistrement original.

public void Update(User user) 
    { 
     var userToUpdate = (from u in db.UserSet 
          where u.UserID == user.UserID 
          select u).FirstOrDefault(); //original record 
     db.ApplyPropertyChanges(userToUpdate.EntityKey.EntitySetName, 
      user); 
     db.SaveChanges(); 
    } 

déclaration Ajouter pour la même pension:

public void Add(User user) 
    { 
     user.MemberFrom = DateTime.Now; 
     _repository.AddToUserSet(user); 
     _repository.SaveChanges(); 
    } 

Répondre

1

Non, vous ne pouvez pas le faire avec EF (sauf si vous utilisez ADO.NET directement bien sûr). Cela dit, vous pouvez simplifier le code de récupération en ajoutant des méthodes à la classe partielle de votre contexte d'entité. Voici comment je le fais:

public partial class MyEntities 
{ 
    public T GetById<T>(object id) where T : class 
    { 
     EntityKey key = CreateKey<T>(id); 
     // see http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.getobjectbykey.aspx 
     return (T)GetObjectByKey(key); 
    } 

    public static EntityKey CreateKey<T>(object id) 
    { 
     var type = typeof(T); 
     return new EntityKey("MyEntities." + type.Name, "Id", id); 
    } 
} 

Votre code ci-dessus doit être

public void Update(User user) 
{ 
    var userToUpdate = db.GetById<UserSet>(user.UserID); 
    db.ApplyPropertyChanges(userToUpdate.EntityKey.EntitySetName, user); 
    db.SaveChanges(); 
} 
+0

Vous avez raison, je ne sais pas ce que je pensais. Je devrais utiliser la méthode getObject au lieu de re-taper la même requête, merci. Je n'ai pas mis en œuvre le get générique, mais je le ferai dès que j'aurais d'autres fonctionnalités. Merci encore. – Geo

Questions connexes