2016-03-21 78 views
2

我正在使用ASP.Net 5/EF7開發新的Web應用程序。使用EF7的存儲庫模式

我也在考慮知識庫模式以及實體框架。

我正在尋找一些建議來處理我的通用存儲庫類。由於EF7目前還沒有Find()方法,所以在通用資源庫類中實現GetById(int id)方法時遇到了一些困難。我知道可以使用FirstOrDefault(),但我無法訪問模型中的實際「Id」。

你能幫我找一個替代品嗎?

下面是我的通用倉庫等級:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
    protected readonly PersonDBContext _dbContext; 

    public Repository(PersonDBContext context) 
    { 
     _dbContext = context; 
    } 

    public IEnumerable<TEntity> GetAll() 
    { 
     return _dbContext.Set<TEntity>().ToList(); 
    } 

    public TEntity Get(int? id) 
    { 
     return _dbContext.Set<TEntity>().FirstOrDefault(); 
    } 

    public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate) 
    { 
     return _dbContext.Set<TEntity>().Where(predicate); 
    } 

    public void Add(TEntity entity) 
    { 
     _dbContext.Set<TEntity>().Add(entity); 
    } 

    public void Remove(TEntity entity) 
    { 
     _dbContext.Set<TEntity>().Remove(entity); 
    } 
} 

感謝 賽義德

+0

「TEntity」上是否存在可引用的一些常見屬性/字段?你能說出'TEntity'的樣子嗎? – Nkosi

+0

當我將它傳遞給存儲庫類時,TEntity將成爲模型。這是通用的存儲庫類。在這種情況下,TEntity將被稱爲例如人。 – Xerxes1TheGreat

回答

1

下面是一些你可以試試。

根據您的評論,您不知道模型的實際ID,然後使用類似Find這樣的表達式來獲取您正在查找的實體。

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class { 
    //..... 

    public TEntity Get(Expression<Func<TEntity, bool>> predicate) 
    { 
     return _dbContext.Set<TEntity>().FirstOrDefault(predicate); 
    } 

    //..... 
} 
+0

這是一個很好的方法,謝謝。但是,您認爲這是一種有效的方法,因爲我將擁有多個模型(Code First來自數據庫),並且都必須從此接口派生出來? – Xerxes1TheGreat

+0

在這種情況下,您可以使用表達式路線並獲取第一個結果。我將編輯答案以反映這一點。 – Nkosi

+0

非常感謝您的建議。是的你是對的,我已經使用了Find()方法,因爲在EF7中沒有真正的發現,我也沒有意識到我也可以使用GetById()的相同方法實現。再次感謝您的幫助 – Xerxes1TheGreat

1

我已經創建了我的博客的一篇文章,解釋瞭如何創建一個通用的存儲庫,你可以在Generic Repository using EntityFramework

檢查它,你將有另一個參數添加的,而不是隻爲你的通用接口,實體類型,您還可以傳遞主鍵類型,也可以使用基類

+0

謝謝我的朋友,你的想法也很聰明。我看了一下並做了一些筆記。非常感謝。 – Xerxes1TheGreat