2016-03-21 48 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