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

Yus*_*tme 6 asp.net-mvc entity-framework repository unit-of-work ef-code-first

但你怎么用呢?

我有一个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; }
Run Code Online (Sandbox Code Playgroud)

我还需要为每个实体创建存储库吗?或者class除了CRUD之外还有一些方法可以做一些自定义计算吗?

我知道这一行:

kernel.Bind<MyDbContext>().ToSelf().InRequestScope();
Run Code Online (Sandbox Code Playgroud)

就足够了DI,它将通过构造函数注入适用的上层类.

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

关于此事的任何启示都非常感激.

Iro*_*n84 3

我在几个项目中在 EF 之上添加了一个存储库层(它在其构造中本质上利用了存储库和 UoW 模式),并且我使用一个使用泛型的类来完成此操作,因此我只需要一个文件我的所有实体。您可以决定是否要这样做,但我发现它在我的项目中很有用。

我的存储库通常是像下面所示的那样开始的,如果/当我遇到需要它们时,接下来会提供更多扩展方法(显然我不会显示所有扩展方法,这由您决定如何实现)你的存储库)。

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

显然,这不是全部,但这对于这个答案来说应该足够了。如果您想了解有关此主题的更多信息,我确实写了一篇关于此主题的博客文章,您可以在这里找到

无论您决定做什么,祝您好运。