实体框架6提供开箱即用的存储库和UoW

时间:2014-12-15 20:12:42

标签: asp.net-mvc entity-framework ef-code-first unit-of-work repository

但你怎么用呢?

我已经设置了Code First项目,并尝试使用这个新的EF6。阅读至少2年关于EF4 / 5的各种帖子/博客。但没有任何关于EF6的信息。

假设我有这些实体:

public DbSet<Person> Persons { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Invoice> Invoices { get; set; }

我还需要为每个实体创建存储库吗?或者class是否足以使用某些方法进行除CRUD之外的一些自定义计算?

我知道这一行:

kernel.Bind<MyDbContext>().ToSelf().InRequestScope();

对于DI就足够了,并且它会通过构造函数注入适用的上层类。

该项目有一个类库和一个Web项目asp.net-mvc。类lib项目包含我的实体并且启用了Migrations

对此事的任何启示都非常感激。

2 个答案:

答案 0 :(得分:3)

我已在几个项目中在EF(在其构造中固有地使用Repository和UoW模式)上添加了一个Repository层,并且我已经在一个使用泛型的类中完成了我只需要为我的所有实体提供一个文件。您可以决定是否要这样做,但我发现它在我的项目中很有用。

我的存储库通常就像我在下面显示的那样开始,如果/当我遇到需要时会跟进更多的扩展方法(显然我没有显示所有这些,&# 39;由您决定如何实施您的存储库)。

public class Repository<T> : IRepository<T> where T : class
{
    protected IDbContext Context;
    protected DbSet<T> DbSet { get { return Context.Set<T>(); } }

    public Repository(IDbContext context = null)
    {
        Context = context ?? new DbContext();
    }

    public void Add(T newRecord)
    {
        DbSet.Add(newRecord);
    }

    public void Update(T record)
    {
        var entry = Context.Entry(record);
        DbSet.Attach(record);
        entry.State = EntityState.Modified;
    }

    public void Remove(T record)
    {
        Context.Entry(record).State = EntityState.Deleted;
        DbSet.Remove(record);
    }

    public IQueryable<T> Where(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Where(predicate);
    }

    public bool Contains(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Count(predicate) > 0;
    }

    public int Count(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Count(predicate);
    }

    public int Save()
    {
        return Context.SaveChanges();
    }
}

我使用了存储库有两个主要原因:

  1. 单元测试。执行此模式允许我伪造基础数据,而不必在我的数据库中存在错误数据。我需要做的只是创建IRepository的另一个实现,它使用内存列表作为其数据源,并且我已经为我的页面设置了查询该存储库。

  2. 扩展。很多次我将一些方法放入我的存储库中,因为我发现自己经常在控制器中使用查询执行相同的逻辑。这非常有用,特别是因为你的客户端代码并不需要知道它是如何做到的,只是它正在这样做(如果你需要改变它的逻辑,这将使它变得更容易)一个文件与多个文件。)

  3. 这显然不是全部,但这应该足以满足这个答案。如果您想了解有关此主题的更多信息,我确实在其上撰写了一篇博文can find here

    祝你好好做什么。

答案 1 :(得分:2)

实体框架本身可以被视为存储库。它有助于处理数据,在本例中是数据库。这就是存储库所做的一切。

如果您想在 EF 提供的基础上构建另一个存储库,则完全取决于您 - 或您的业务规则。

许多复杂项目使用2-3层存储库,其中包含Web服务。性能较低,但你可以获得其他计划,如安全性,弹性,音乐会分离等等。

您的公司可能会决定从不直接从前端项目访问数据符合他们的最佳利益。他们可能会强迫您构建单独的Web服务项目,只能从localhost 访问。因此,您最终将在Web服务项目中将 EF 作为存储库。在前端,您显然需要构建另一个 Repository ,它将与Web服务一起使用。

这也取决于你的很多项目。如果它是一个小项目,那么在 EF 之上构建第二个存储库实在是太过分了。但话又说回来,请看上面。如今安全比性能更重要。

要在政治上正确,我要包括Wiktor Zychla的评论:
DbSet是一个存储库,DbContext是一个工作单元。”实体框架是一个存储库“可能会导致不必要的混淆。”