2011-08-07 5 views
2

Je suis en train d'écrire un référentiel générique à utiliser pour toutes mes opérations CRUD modèle en utilisant Entity Framework CTP5 comme suit:Entity Framework référentiel générique

public class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity 
    { 
     public DbContext Context { get; set; } 


     public void Insert(TEntity entity) 
     { 
       if (Context.Entry<TEntity>(entity).State == EntityState.Detached) 
       { 
        Context.Set<TEntity>().Attach(entity); 
       } 
       Context.Set<TEntity>().Add(entity); 
       Context.SaveChanges(); 

     } 
     public void Delete(int id) 
     { 
       TEntity entity = Context.Set<TEntity>().Find(id); 
       if (Context.Entry<TEntity>(entity).State == EntityState.Detached) 
       { 
        Context.Set<TEntity>().Attach(entity); 
       } 
       Context.Set<TEntity>().Remove(entity); 
       Context.SaveChanges(); 

     } 
     public void Delete(TEntity entity) 
     { 
       Context.Set<TEntity>().Remove(entity); 
       Context.SaveChanges(); 

     } 
     public void Update(TEntity entity) 
     { 
       TEntity status = Context.Set<TEntity>().Find(entity.Id); 
       status = entity; 
       Context.SaveChanges(); 

     } 



     public TEntity GetFirst() 
     { 

       var entity = Context.Set<TEntity>().FirstOrDefault(); 
       if (entity == null) return null; 
       return entity; 


     } 
     public TEntity GetNext(int id) 
     { 

       var entity = (from u in Context.Set<TEntity>() 
           where u.Id > id 
           select u).FirstOrDefault(); 
       if (entity == null) return null; 
       return entity; 

     } 
     public TEntity GetPrevoius(int id) 
     { 

       var entity = (from u in Context.Set<TEntity>() 
           where u.Id < id 
           orderby u.Id descending 
           select u).FirstOrDefault(); 
       if (entity == null) return GetFirst(); 
       return entity; 
     } 
     public TEntity GetLast() 
     { 

       var entity = (Context.Set<TEntity>().OrderByDescending(u => u.Id)).FirstOrDefault(); 
       if (entity == null) return null; 
       return entity; 

     } 
     public TEntity GetById(int id) 
     { 
      return Context.Set<TEntity>().Find(id); 

     } 
     public int GetMaxId() 
     { 

       var max = Context.Set<TEntity>().Count()+ 1; 
       return max; 

     } 
} 

tout fonctionne bien, mais la méthode de mise à jour qui nither ne marche pas générer une erreur, ni sauver tout changement à la base de données. Quelqu'un peut-il me guider comment résoudre ce problème?

Répondre

2

Vous écrasez la variable status avec un tout nouvel objet, en prenant celui de la base de données hors de portée, mais pas modifier réellement l'objet qui est attaché au contexte, qui est ce que vous voulez faire.

La seule façon que je peux penser du haut de ma tête est d'utiliser la réflexion pour lire toutes les propriétés du type, et affecter les valeurs à l'objet original basé sur la nouvelle, quelque chose comme:

foreach (var prop in typeof(TEntity).GetProperties()) 
{ 
    prop.SetValue(status, prop.GetValue(entity, null), null); 
} 
+0

je le pense, merci – bobby

8

Vous pouvez utiliser CurrentValues.SetValues:

public void Update(TEntity entity) 
{ 
    TEntity status = Context.Set<TEntity>().Find(entity.Id); 
    Context.Entry(status).CurrentValues.SetValues(entity); 
    Context.SaveChanges(); 
} 

Il met à jour les propriétés scalaires et complexes, mais pas les propriétés de navigation.

Questions connexes