通用存储库实体框架6实现

时间:2013-12-08 08:27:18

标签: entity-framework entity-framework-6

我已经分配了一个新项目,我决定给EF一个go.In这个项目我所做的就是获取没有持久性的数据。我必须实现一些缓存,就是这样。

阅读存储库模式我发现了大量的代码示例等......它们似乎对我来说都是错误的。它们实现了一对一的Entity to Repository。

在我的项目中,我只需要阅读数据而不是保存等...只是阅读。我有100个实体我无法创建100s存储库似乎都错了。

我决定从简单开始,我都需要这个:

public interface IRepository : IDisposable
{
    IEnumerable<T> GetAll<T>() where T : class;
    IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class;
    T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class;
}

public class Repository : IRepository
{
    public IEnumerable<T> GetAll<T>() where T : class
    {
        return ???.ToArray();
    }

    public IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return ???.Where(predicate).ToArray();
    }

    public T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return ???.Where(predicate).FirstOrDefault();
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

我正在努力的是我把“???”放在哪里应该是我的IdbSet。

我如何实施我的具体存储库?任何建议或点头测试样本都可以。

非常感谢

1 个答案:

答案 0 :(得分:1)

首先,您最好更改GetAll()Find()方法以返回IQueryable<T>而不是IEnumerable<T>,以便使用Linq-to实现对数据集的进一步查询-Entities。

从EF实施开始,尝试这样的事情:

public class EFRepository : DbContext, IRepository
{
    // ctor:
    // pass a full connecting-string, or "name=someName" from configuration
    public EFRepository(string connectionStringOrName) : base(connectionStringOrName)
    {
          // init sets
          this.Entities1 = this.Set<EntityOfSomeType>();
          this.Entities2 = this.Set<EntityOfOtherType>();
    }

    public IEnumerable<T> GetAll<T>() where T : class
    {
        return this.Set<T>().ToArray();
    }

    public IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return this.Set<T>().Where(predicate).ToArray();
    }

    public T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return this.Set<T>.FirstOrDefault(predicate);
    }

    public void Dispose()
    {
        base.Dispose();
    }

    // Your DbSets...
    public IDbSet<EntityOfSomeType> Entities1 { get; set; }
    public IDbSet<EntityOfAnotherType> Entities2 { get; set; }
}

(我假设你要代码优先使用DbContext