但如何使用它呢?
我有一个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
。其中类库项目包含我的实体并且具有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();
}
}
我使用存储库有两个主要原因:
单元测试。执行此模式允许我伪造底层数据,而不必在数据库中包含错误数据。我需要做的只是创建另一个实现IRepository
它使用内存中的列表作为其数据源,并且我已准备好我的页面来查询该存储库。
可扩展性。很多次我将一些方法放入我的存储库中,因为我发现自己不断地在控制器中对查询执行相同的逻辑。这非常有用,特别是因为您的客户端代码不需要知道它是如何做的,只需知道它正在做(如果您需要更改一个文件与多个文件的逻辑,这将变得更容易) )。
显然,这不是全部,但这对于这个答案来说应该足够了。如果您想了解更多关于这个主题的信息,我确实写了一篇博客文章,您可以可以在这里找到.
无论您决定做什么,祝您好运。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)