2014-05-13 79 views
1

我已經用相同的格式編寫了3個存儲庫。我如何創建一個通用資料庫?如何使用實體框架創建通用資源庫?

public class MyRepository : MyDataRepositoryBase<ASD> 
{ 
    protected override ASD AddEntity(MyDataContext entityContext, ASD entity) 
    { 
     return entityContext.ASDSet.Add(entity); 
    } 

    protected override IEnumerable<ASD> GetEntities(MyDataContext entityContext) 
    { 
     return from e in entityContext.ASDSet 
       select e; 
    } 
} 

這是我迄今爲止...

public class ComponentsRepository<T, U>:MyDataRepositoryBase<T> 
    where T : class,new() 
    where U : DbSet<U>, new() 
{ 
    protected override T AddEntity(MyDataContext entityContext, T entity) 
    { 

     return entityContext.U.Add(entity); 
    } 
} 

我基本上是試圖找到一種方法來調用DbSet「entityContext.ASDSet」不知道它是什麼。

任何想法或者我應該讓它去...

+0

只需鏈接:http: -patterns-in-an-asp-net-mvc-application –

+0

'DbSet' *是一個通用的存儲庫。 –

+0

我所做的是刪除DbSet實體並使用下面的建議答案返回 – MrM

回答

3

實體框架都有一套方法,所以你能做到這一點

return entityContext.Set<T>().Add(entity); 

但它不會檢查你傳遞一個未映射的類。所以它的使用風險自負,如果沒有映射就會拋出異常。我們有一個基類,我們所有的實體都繼承了這個基類,所以我們對它進行了約束,但即使這樣也不能保證一個類在實體框架中映射。

+0

這完全是我在找的東西。謝謝! – MrM

0

對於什麼是值得的通用知識庫被認爲是反模式。這是我以前用的是執行:

public class Repository<T> : IRepository<T> where T : class 
{ 
    private readonly IDbContext _context; 
    private readonly IDbSet<T> _dbSet; 

    public Repository(IDbContext context) { 
     _context = context; 
     _dbSet = context.Set<T>(); 
    } 

    public void Add(T entity) { 
     _dbSet.Add(entity); 
    } 

    public void Update(T entity) { 
     _context.Entry(entity).State = EntityState.Modified; 
    } 

    ... 
} 

我IDbContext:

public interface IDbContext 
{ 
    IDbSet<T> Set<T>() where T : class; 
    DbEntityEntry Entry<T>(T entity) where T : class; 
    int SaveChanges(); 
    ... 
} 

我用這個用的UnitOfWork,我做了我通過節約和資源庫檢索。也就是說,我確實發現在我的實體周圍創建存儲庫要乾淨得多。