繁体   English   中英

UnintentionalCodeFirstException | 使用数据库优先使用 Effort.Ef6 进行实体框架单元测试

[英]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()
  • 我已经尝试应用此解决方案但没有成功。
  • Moq模拟我的DbContext ,这绝对不是一个选项。

问题

我如何创建和使用内存数据库(努力)?


附加信息

当我取消对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM