我正在使用带有自定义程序集的 LINQPad,其后面有一个 SQL Server CE 数据库,当时可能存在也可能不存在。MigrateDatabaseToLatestVersion
自定义程序集使用 Entity Framework 代码优先和自动迁移,并包括一个简单的初始化程序,如果数据库不存在,则从该初始化程序继承。我已经使用它几个星期了,它运行得非常好。
今天早上,在一个小故障被证明是令人沮丧的难以诊断之后,直到我意识到日志中的两个事件之间发生了迁移,我决定如果数据库自己的日志表在应用迁移时记录下来会很好。为此,我Seed()
在初始化程序中的方法中添加了几行,以实例化我一直在使用的通用存储库/工作单元容器,将记录添加到日志表,并将更改提交回数据库. repo 有一个标志表明它不拥有底层上下文,所以我可以确定它不会处理我将尝试使用的上下文。
现在,如果我更改模型(我通过反复注释和取消注释DbSet
上下文类中的一个属性来进行测试),则会插入一条记录以说明发生了迁移。正是我想要的。但是,如果 .sdf 文件不存在,LINQPad 会给我以下错误:
基础提供程序在 Open
InnerException 上失败:找不到数据库文件。检查数据库的路径。
虽然错误消息完全不言自明(文件不存在,因此无法找到),但不清楚的是为什么它不像以前那样创建文件。真正奇怪的是,如果我重新编译自定义程序集,然后再次运行 LINQPad 查询,那么 LINQPad 将创建.sdf
并愉快地继续。即使对程序集的更改无关紧要,也会发生这种情况。在测试中,我运行了查询,看着它失败,然后在存储库类的注释末尾添加了一个空格,重新编译它,然后再次运行查询......它工作了。我完全无法解释这应该如何产生影响。
此时可能值得一提的是,我在这里处理的“自定义程序集”是 LINQPad 自己的“我的扩展”文件。是的,我在我的扩展文件中使用代码优先自动迁移初始化和通用规范模式事务存储库编写了一个数据上下文。是的,我意识到这可能不是它的意思。我很无聊,想测试一些东西。无论如何,这可能会在某处引起一些奇怪的事情。可能不是,但我想我会提到它以防万一。