2

情况

我想启用DbContext基于实体框架 6 的单元测试。我已经DbContext使用数据库优先方法创建了我和我的模型,现在有一个.edmx设计器文件。

问题

我自动创建DbContext的确实覆盖了DbContext.OnModelCreating这样的方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

我正在尝试根据本文DbContext的信息在我的模拟数据访问服务中创建我的新实例。我的代码没有像这篇博文的作者指出的那样运行。我的构造函数看起来和他的一模一样。我的初始化如下所示:Database.SetInitializer;DbContext

public DatabaseEntities(DbConnection connection) 
     : base(connection, true) { }

达到前面提到的覆盖时会导致以下异常OnModelCreating

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: '上下文在 Code First 模式下使用,代码是从 EDMX 文件生成的,用于 Database First 或 Model First 开发。这将无法正常工作。要解决此问题,请不要删除引发此异常的代码行。如果您希望使用 Database First 或 Model First,请确保 Entity Framework 连接字符串包含在启动项目的 app.config 或 web.config 中。如果要创建自己的 DbConnection,请确保它是 EntityConnection 而不是其他类型的 DbConnection,并且将其传递给采用 DbConnection 的基本 DbContext 构造函数之一。要了解有关 Code First、Database First 和 Model First 的更多信息,请参阅此处的实体框架文档:http://go.microsoft.com/fwlink/?LinkId=394715 '

关于 stackoverflow 有很多问题,它们专注于在使用数据库优先方法时努力进行单元测试,但似乎没有人像我一样遇到类似的问题。

我已经尝试过的事情

  • 在网上找了很久的解决办法。
  • 取消注释被覆盖的OnModelCreating().
  • 我已经尝试应用此解决方案但没有成功。
  • DbContextMoq模拟我,这绝对不是一种选择。

问题

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


附加信息

当我取消注释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'。

4

2 回答 2

1

如果有人正在寻找 db-first 方法的解决方案,这对我有用:

string connStr = @"metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;";
DbConnection connection = EntityConnectionFactory.CreateTransient(connStr);
return new MyDatabaseContext(connection);

connStr从我的 web/app.config 中得到了这个部分。
还有,我没碰OnModelCreating

于 2020-04-27T12:56:14.903 回答
0

问题是我必须为我的 KeyValuePair 数据集指定密钥。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
    base.OnModelCreating(modelBuilder, null);
}

非常感谢罗伯特·约根斯加德·恩达尔

于 2017-09-12T13:33:42.497 回答