EntityFramework 6.0 CreateDatabaseIfNotExists代码首先尝试在创建初始结构之前进行迁移

时间:2014-07-09 21:33:00

标签: entity-framework

我有一个完美的EF6.0 DbContext,我使用代码初始化:

        using (var db = new MyDbContext())
        {
            db.Database.CreateIfNotExists();
        }

我今天开始测试迁移。我做的是:我在包管理器窗口中运行了以下命令:

Enable-Migrations –EnableAutomaticMigrations

然后我修改了一个添加public int TestField { get;set; }属性的类并运行了:

Add-Migration AddTestId

ADDITION:另外,我创建了一个静态初始值设定项:

    static MyDbContext()
    {
        Database.SetInitializer(
            new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>()); 
    }

我试图进行单元测试。它过去做的是从头开始创建一个数据库(例如:在单元测试之前数据库不存在)。它使用的是我最初发布的代码,例如:CreateIfNotExists()

我注意到单元测试现在因SQL异常Cannot find the object "dbo.RecordExpirations" because it does not exist or you do not have permissions而失败。

我在数据库上运行SQL分析器以查看正在运行的内容,我看到以下内容(为简单起见,代码已清理,&#34; go&#34;&#34; sp_resetconnection&#34;已删除行):< / p>

select serverproperty('EngineEdition')
SELECT Count(*) FROM sys.databases WHERE [name]=N'MYDBNAME'
create database [MYDBNAME]
if serverproperty('EngineEdition') <> 5 execute 
     sp_executesql N'alter database [MYDBNAME] set read_committed_snapshot on'
ALTER TABLE [dbo].[RecordExpirations] ADD [TestField] [int] NOT NULL DEFAULT 0
drop database [MYDBNAME]

基本上发生的事情是:在create database之后:即使从未创建初始结构,EF也会直接继续运行迁移,因此ALTER TABLE失败,因为尚未创建表尚未更改。

我有一种感觉,我错过了一步。我做错了什么?

2 个答案:

答案 0 :(得分:1)

我做了一些挖掘并找出了最终为我制定的程序。这必须在干净的项目上完成,例如:文件夹Migrations不应该已经存在。如果是 - 在源代码管理中执行回滚,并确保它不在物理磁盘上。

此外,似乎EF正在使用服务器(或localdb)上的数据库,因此如果您使用它,从头开始重建架构可能是个好主意。在我的情况下,删除它是有效的,因为我从零开始。

首先要做的事情:

  • 将我的数据库项目设置为启动项目(重要的是这是从app.config开始的地方)
  • 在包管理器窗口中将我的数据库项目设置为默认值

删除默认数据库

  • 检查我的db项目中的app.config,确保有一个有效的连接字符串,MyDbContext的默认构造函数正在使用它。
  • 删除该数据库

让包管理器发挥其魔力,运行以下命令:

Enable-Migrations –EnableAutomaticMigrations
Add-Migration "Initial"
Update-Database

Add-Migration "Initial"之后,文件必须以public override void Up()方法出现在Migrations文件夹中,该文件应创建完整的架构。如果不这样做,就会出现问题。

答案 1 :(得分:-1)

对数据库中的存储数据使用CreateFile,ReadFile,WriteFile代替取消签名函数SQL(这是复杂和最难的)。 对于c#,使用StreamWriter,BinaryWriter,StreamReader,BinaryReader而不是EntityFrameWork(这非常复杂和困难!)。 Perso我使用文件功能API来存储数据。