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

时间:2017-09-12 08:57:55

标签: c# entity-framework unit-testing entity-framework-6 effort

情况

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

问题

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

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

我正在尝试根据this article的信息在我的模拟数据访问服务中创建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的问题,在使用数据库优先的apporach时会集中精力进行单元测试,但似乎没有人像我一样有类似的问题。

我已经尝试过做什么

  • 长时间在互联网上寻找解决方案。
  • 取消注释被覆盖的OnModelCreating()
  • 我已尝试申请this solution但未成功。
  • 使用Moq模拟我的DbContext,这绝对不是一种选择。

问题

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

其他信息

当我取消注释OnModelCreating()时,首次访问DataContext时将抛出异常。 E.g:

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',没有定义键。'

2 个答案:

答案 0 :(得分:1)

如果有人在寻找数据库优先方法的解决方案,那么这对我有用:

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

答案 1 :(得分:0)

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

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

非常感谢Robert Jørgensgaard Engdahl