我有一个完美的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失败,因为尚未创建表尚未更改。
我有一种感觉,我错过了一步。我做错了什么?
答案 0 :(得分:1)
我做了一些挖掘并找出了最终为我制定的程序。这必须在干净的项目上完成,例如:文件夹Migrations
不应该已经存在。如果是 - 在源代码管理中执行回滚,并确保它不在物理磁盘上。
此外,似乎EF正在使用服务器(或localdb)上的数据库,因此如果您使用它,从头开始重建架构可能是个好主意。在我的情况下,删除它是有效的,因为我从零开始。
首先要做的事情:
删除默认数据库
让包管理器发挥其魔力,运行以下命令:
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来存储数据。