C# 测试时的工作量问题
由于在内存中设置数据库是多么“容易”,所以我一直在阅读关于使用努力进行单元测试的文章。我一直试图在我的测试数据服务中实现这一点,但我一直遇到问题。 我使用的是实体框架6和从现有表生成的模型 上下文模型C# 测试时的工作量问题,c#,.net,entity-framework,unit-testing,C#,.net,Entity Framework,Unit Testing,由于在内存中设置数据库是多么“容易”,所以我一直在阅读关于使用努力进行单元测试的文章。我一直试图在我的测试数据服务中实现这一点,但我一直遇到问题。 我使用的是实体框架6和从现有表生成的模型 上下文模型 public partial class Entities : DbContext { public Entities() : base("name=Entities") { } //Overloading for effort unit test
public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
}
//Overloading for effort unit test
public Entities(DbConnection connection) : base(connection,true)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//throw new UnintentionalCodeFirstException();
}
public virtual DbSet<REPAIR_CHECK_IN_TABLE> REPAIR_CHECK_IN_TABLEs { get; set; }
public virtual DbSet<tblPlanarWarranty> tblPlanarWarranties { get; set; }
}
最初我会得到以下错误
ADO.NET提供程序没有固定名称为“efforce.provider”的实体框架提供程序
然后,我将所述提供者添加到应用程序配置文件的“我的提供者”部分,并开始接收此错误
实体框架提供程序类型“Effort.ProviderServices,Effort,Version-1.0.0.0”的“实例”成员未返回从“System.Data.entity.Core.Common.DBProviderServices”继承的对象
有人知道我做错了什么吗?在网站上,这就像几行一样简单,但这已经变成了一团乱麻。小心!当使用EF6时,不要安装ZZZ项目的努力 通过相同的ZZZ项目安装efforce.EF6
class SchoolDbContext : DbContext
{
// the standard constructors you probably already use:
public SchooldDbContext() : base(...) {}
public SchoolDbContext(string nameOrConnectionString) : base(nameOrConnectionString) {}
// add this one for effort:
public SchoolDbContext(DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection) { }
... // DbSets, etc
使用干净的空数据库
重用数据库
此数据库将在程序运行期间保持。该模型将只进行一次creade
const string dbName = "MyDb"
var dbConnection = Effort.DbConnectionFactory.CreatePersistent(dbName);
using (var dbContext = new SchoolDbContext(dbConnection)
{
dbContext.Schools.Add(new School {...});
dbContext.SaveChanges();
}
dbConnection = Effort.DbConnectionFactory.CreatePersistent(dbName);
using (var dbContext = new SchoolDbContext(dbConnection)
{
var schoolCount = dbContext.Schools.Count();
// expect the school you just added
}
那么,您的efforce.ProviderServices类不是从System.Data.Entity.Core.Common.DBProviderServices继承的吗?我认为错误很明显这是真的,我更关心的是如何正确地实现这一点,因为这里是我必须处理的所有问题。您使用的是Effort.EF6版本吗?来自您链接的评论:
完成此操作后,我可以使用nuget的EF6“efforce.EF6”库(与没有EF6的“efforce”库不同)和数据库优先方法使示例正常工作。
谢谢,这就成功了您是我的英雄!我希望我能把分数作为答案,但分数还不够。谢谢你指出,我完全忽略了另一个nugut软件包。
var dbConnection = Effort.DbConnectionFactory.CreateTransient();
using (var dbContext = new SchoolDbContext(dbConnection, true)
{
dbContext.Schools.Add(new School {...});
dbConext.SaveChanges();
// this database exists as long as the connection exists
var schoolCount = dbContext.Schools.Count();
// expect one school
}
// a new empty database will be created: there won't be any schools
dbConnection = Effort.DbConnectionFactory.CreateTransient();
using (var dbContext = new SchoolDbContext(dbConnection)
{
var schoolCount = dbContext.Schools.Count();
// expect no schools
}
const string dbName = "MyDb"
var dbConnection = Effort.DbConnectionFactory.CreatePersistent(dbName);
using (var dbContext = new SchoolDbContext(dbConnection)
{
dbContext.Schools.Add(new School {...});
dbContext.SaveChanges();
}
dbConnection = Effort.DbConnectionFactory.CreatePersistent(dbName);
using (var dbContext = new SchoolDbContext(dbConnection)
{
var schoolCount = dbContext.Schools.Count();
// expect the school you just added
}