形势
我希望能够基于实体框架6对我的DbContext进行单元测试,我已经使用数据库优先方法创建了我的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:‘上下文是在代码优先模式下使用的,代码是从EDMX文件中生成的,用于数据库优先或模型优先开发。这将不能正常工作。若要解决此问题,请不要删除引发此异常的代码行。如果希望首先使用数据库或模型优先,那么请确保实体框架连接字符串包含在启动项目的app.config或web.config中。如果要创建自己的DbConnection,请确保它是EntityConnection而不是其他类型的DbConnection,并将其传递给接受DbConnection的基本DbContext构造函数之一。要了解有关代码优先、数据库优先和模型的更多信息,请参见此处的实体框架文档:http://go.microsoft.com/fwlink/?LinkId=394715‘
关于堆栈溢出有很多问题,这些问题集中在使用数据库优先分配时的单元测试上,但似乎没有人像我这样有类似的问题。
我已经做过的事
问题是
如何创建和使用内存中的数据库(通过努力)?
附加信息
当我取消对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’类型的。
发布于 2017-09-12 13:33:42
问题是我必须为我的KeyValuePair数据集指定密钥。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
base.OnModelCreating(modelBuilder, null);
}发布于 2020-04-27 12:56:14
如果有人在寻找db优先方法的解决方案,这对我来说是有效的:
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。
https://stackoverflow.com/questions/46172095
复制相似问题