2011-08-07 25 views
2

Entity Frameworkのジェネリックリポジトリ

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; 

     } 
} 

すべてがnitherにエラーが発生したり、保存does notの罰金が、アップデートの方法を動作しますすべての変更はデータベースに戻されます。 誰も私にこの問題を解決する方法を教えてもらえますか?

答えて

2

あなたはスコープの外にデータベースから1を取って、全く新しいオブジェクトと変数statusを上書きし、実際にあなたがしたいと思うものです文脈に装着されているオブジェクトを変更していません行う。

私は私の頭の上から考えることができる唯一の方法は、タイプのすべてのプロパティを読み取るためにリフレクションを使用して、新しいものに基づいて、元のオブジェクトに値を割り当てる、のようなものです:

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

私はそう思います、ありがとう – bobby

8

あなたはCurrentValues.SetValuesを使用することができます。

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

それはスカラーと複雑なプロパティではなく、ナビゲーションプロパティを更新します。