我想基于实体框架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()
。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',没有定义键。'
答案 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);
}