首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于数据库的UnintentionalCodeFirstException /实体框架单元Effort.Ef6测试

基于数据库的UnintentionalCodeFirstException /实体框架单元Effort.Ef6测试
EN

Stack Overflow用户
提问于 2017-09-12 08:57:54
回答 2查看 3.7K关注 0票数 3

形势

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

问题所在

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

代码语言:javascript
复制
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

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

代码语言:javascript
复制
public DatabaseEntities(DbConnection connection) 
     : base(connection, true) { }

,当到达前面提到的重写的OnModelCreating时,会导致以下异常

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

关于堆栈溢出有很多问题,这些问题集中在使用数据库优先分配时的单元测试上,但似乎没有人像我这样有类似的问题。

我已经做过的事

  • 在互联网上搜索很长一段时间寻找解决方案。
  • 取消对重写的OnModelCreating()的注释。
  • 我已经试过申请这个解决方案,但没有成功。
  • 莫克来嘲笑我的莫克,这绝对不是一种选择。

问题是

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

附加信息

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

代码语言:javascript
复制
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’类型的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-12 13:33:42

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

代码语言:javascript
复制
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
    base.OnModelCreating(modelBuilder, null);
}

非常感谢Robert J rgensgaard Engdahl

票数 1
EN

Stack Overflow用户

发布于 2020-04-27 12:56:14

如果有人在寻找db优先方法的解决方案,这对我来说是有效的:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46172095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档