为什么DbContext没有实现IDbContext接口?
为什么entity framework中没有IDbContext
接口? 如果存在一个像SaveChanges()等方法的现有接口,那么从中派生自定义的数据库上下文接口会不会更容易?
public interface ICustomDbContext : IDbContext { // add entity set properties to existing set of methods in IDbContext IDbSet<SomeEntity> SomeEntities { get; } }
我看到这个IDbContext
:
看到这个链接然后你为你的Entities Context With接口创build一个新的部分类。
public partial class YourModelEntities : DbContext, IDbContext
编辑:我编辑这篇文章,这对我有用。 我的上下文
namespace dao { public interface ContextI : IDisposable { DbSet<TEntity> Set<TEntity>() where TEntity : class; DbSet Set(Type entityType); int SaveChanges(); IEnumerable<DbEntityValidationResult> GetValidationErrors(); DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity:class; DbEntityEntry Entry(object entity); string ConnectionString { get; set; } bool AutoDetectChangedEnabled { get; set; } void ExecuteSqlCommand(string p, params object[] o); void ExecuteSqlCommand(string p); } }
YourModelEntities是你自动生成的分部类,而你需要用同样的名字创build一个新的分部类,然后添加你的新的上下文接口,例如ContextI
注意:接口没有实现所有的方法,因为这些方法是在自动生成代码中实现的。
namespace dao { public partial class YourModelEntities :DbContext, ContextI { public string ConnectionString { get { return this.Database.Connection.ConnectionString; } set { this.Database.Connection.ConnectionString = value; } } bool AutoDetectChangedEnabled { get { return true; } set { throw new NotImplementedException(); } } public void ExecuteSqlCommand(string p,params object[] os) { this.Database.ExecuteSqlCommand(p, os); } public void ExecuteSqlCommand(string p) { this.Database.ExecuteSqlCommand(p); } bool ContextI.AutoDetectChangedEnabled { get { return this.Configuration.AutoDetectChangesEnabled; } set { this.Configuration.AutoDetectChangesEnabled = value; } } } }
我也在想,我想你会用它来DbContext
。 我找不到任何理由,除了你将需要手动实现你自己的DbSet
为你的DbSet
类(所以需要重写你自己的接口)。
没有IDbContext,因为它没用,唯一的实现就是DbContext。
如果你看这个devise会议logging, EF团队也会用IDbSet这样做
对于我来说,unit testing中EF的真正问题是DbContext中的DbConnection,幸好在Codeplex上有一个很好的项目,开始填充这个项目。
Effort是一个function强大的工具,可以方便地为基于Entity Framework的应用程序创build自动化testing。 它基本上是一个ADO.NET提供程序,它在轻量级进程内存数据库上执行所有数据操作,而不是传统的外部数据库。 它提供了一些直观的帮助器方法,使得使用这个提供者与现有的ObjectContext或DbContext类非常容易。 现有代码的简单添加可能足以创build数据驱动的testing,这些testing可以在没有外部数据库的情况下运行。
有了这个,你可以离开你的DbContext和DbSet,并且很容易地进行你的unit testing。 唯一的缺点是Linq提供者之间的区别,一些unit testing可能通过努力,而不是真正的后端。
与EF7更新
我仍然认为,IDbContext将是无用的,问题来自DbConnection。
EF7也不会有一个IDbContext,为了做unit testing,他们现在正在给一个内存提供者。
你可以看到Rowan Miller在这里做一个演示: 现代数据应用与entity framework7