UnintentionalCodeFirstException |使用Database First使用Effort.Ef6进行实体框架单元测试


情况

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

问题

我自动创建的DbContext确实覆盖了DbContext.OnModelCreating方法,如下所示:

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

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

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

在到达前面提到的重写的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的更多信息,请参阅此处的Entity Framework文档: http//go.microsoft.com/fwlink/?LinkId = 394715 '

有关stackoverflow的大量问题,在使用数据库优先的apporach时会集中精力进行单元测试,但似乎没有人像我一样有类似的问题。

我已经尝试过做什么

  • 长时间在互联网上寻找解决方案。
  • 取消注释重写的OnModelCreating()
  • 我已经尝试过应用此解决方案但没有成功。
  • 使用Moq模拟我的DbContext ,这绝对不是一个选项。

这个问题

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


附加信息

当我取消注释OnModelCreating() ,在第一次访问DataContext时将抛出异常。例如:

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

System.Data.Entity.ModelConfiguration.ModelValidationException: '在模型生成期间检测到一个或多个验证错误:MyApplication.Shared.Model.KeyValuePair :: EntityType'KeyValuePair'没有定义键。定义此EntityType的键。 KeyValuePairs:EntityType:EntitySet'KeyValuePairs'基于类型'KeyValuePair',没有定义键。

一般承认的答案

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

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

非常感谢RobertJørgensgaardEngdahl





许可下: CC-BY-SA
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因