[英]UnintentionalCodeFirstException | Entity Framework Unit Testing with Effort.Ef6 using Database First
我想基于实体框架 6 启用我的DbContext
的单元测试。我已经使用数据库优先方法创建了我的DbContext
和我的模型,现在有一个.edmx设计器文件。
我自动创建的DbContext
确实像这样覆盖了DbContext.OnModelCreating
方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
我正在尝试根据本文的信息在我的DbContext
数据访问服务中创建我的DbContext
的新实例。 我的代码没有运行到Database.SetInitializer;
就像这篇博文的作者指出的那样。 我的构造函数看起来和他的一模一样。 我的DbContext
初始化如下所示:
public DatabaseEntities(DbConnection connection)
: base(connection, true) { }
当到达前面提到的重写的OnModelCreating
时会导致以下异常
System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: '上下文正在代码优先模式下使用,代码是从数据库优先或模型优先开发的 EDMX 文件生成的。 这将无法正常工作。 要解决此问题,请不要删除引发此异常的代码行。 如果您希望使用 Database First 或 Model First,请确保实体框架连接字符串包含在启动项目的 app.config 或 web.config 中。 如果您要创建自己的 DbConnection,请确保它是 EntityConnection 而不是某种其他类型的 DbConnection,并将其传递给采用 DbConnection 的基本 DbContext 构造函数之一。 要了解有关代码优先、数据库优先和模型优先的更多信息,请参阅此处的实体框架文档: http : //go.microsoft.com/fwlink/?LinkId=394715 '
有很多关于 stackoverflow 的问题都集中在使用数据库优先方法时努力进行单元测试,但似乎没有人像我一样有类似的问题。
我如何创建和使用内存数据库(努力)?
附加信息
当我取消对OnModelCreating()
注释时,将在第一次访问 DataContext 时抛出异常。 例如:
DbConnection effortConnection = Effort.DbConnectionFactory.CreatePersistent("MockedDatabaseEntities");
using (DatabaseEntities dataContext = new DatabaseEntities(effortConnection))
{
dataContext.Students.Count(); // Exception throws here
}
System.Data.Entity.ModelConfiguration.ModelValidationException: '在模型生成过程中检测到一个或多个验证错误:MyApplication.Shared.Model.KeyValuePair:: EntityType 'KeyValuePair' 没有定义键。 定义此 EntityType 的键。 KeyValuePairs: EntityType: EntitySet 'KeyValuePairs' 基于未定义键的类型 'KeyValuePair'。
如果有人正在寻找 db-first 方法的解决方案,这对我有用:
string connStr = @"metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;";
DbConnection connection = EntityConnectionFactory.CreateTransient(connStr);
return new MyDatabaseContext(connection);
我从我的 web/app.config 中得到了connStr
部分。
另外,我没有接触OnModelCreating
。
问题是我必须为我的 KeyValuePair 数据集指定键。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
base.OnModelCreating(modelBuilder, null);
}
非常感谢罗伯特·约根斯加德·恩达尔!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.