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启用.
关于此事的任何启示都非常感激.
我在几个项目中在 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)
我使用存储库有两个主要原因:
单元测试。执行此模式允许我伪造底层数据,而不必在数据库中包含错误数据。我需要做的只是创建另一个IRepository使用内存列表作为其数据源的实现,并且我已经为我的页面做好了查询该存储库的准备。
可扩展性。很多次我将一些方法放入我的存储库中,因为我发现自己不断地在控制器中对查询执行相同的逻辑。这非常有用,特别是因为您的客户端代码不需要知道它是如何做的,只需知道它正在做(如果您需要更改一个文件与多个文件的逻辑,这将变得更容易) )。
显然,这不是全部,但这对于这个答案来说应该足够了。如果您想了解有关此主题的更多信息,我确实写了一篇关于此主题的博客文章,您可以在这里找到。
无论您决定做什么,祝您好运。
| 归档时间: |
|
| 查看次数: |
405 次 |
| 最近记录: |