2017-03-09 145 views
0

在我的实体框架代码的第一个项目,如果我跑透过包装看到EF代码第一次更新数据库-Script不运行种子()方法

update-database

命令管理控制台,我Seed()方法成功运行。但是,如果我运行带有-script参数的命令:

update-database -script 

...种子()方法不调用,用于播种数据库生成的SQL不包含SQL命令。这种行为是可重复的。我正在尝试创建一个完整的数据库脚本进行部署。

为什么会出现与-script,没有它运行SQL命令之间的差异,我怎么能得到update-database运行Seed()方法使用-script开关是什么时候?

回答

1

我认为这不是一个差异,而是一个设计特征。

其中之一,当您使用-script时,数据库更新不会执行,因此也不应该调用Seed()方法。还有一个事实是迁移是一个设计时间工具,Seed()是一个在运行时编译和调用的方法。

至于为什么不包含在生成脚本Seed()方法的内容,我的回答也运行设计时间的不同的概念。试想一下,你有一个Seed()方法是这样的:

protected override void Seed(PersonContext context) 
{ 
    Random r = new Random(); 
    context.People.Add(new Person("PersonA", r.Next(90)); 
    context.SaveChanges(); 
} 

现在Random的实例在运行时创建,并且下一步()被调用运行时。你会如何将它编译为SQL?如果你有一个文件,你从它读取数据并将其放入数据库会怎么样?这些都是在设计时无法评估的所有事情,只有在运行时(即,如果文件在设计时不在正确的位置,那么只有在运行时才是问题)。这就是为什么像迁移脚手架这样的设计时间工具无法评估它的原因。

+0

不够公平。然而,数据库通常需要某种相当静态的“种子”数据来表达像Enums这样的东西。我不能使用update-database -script来为不包括EmployeeType(1,“Permanent”)(2,“Temporary”)等等的Ops生成DB部署脚本。 –

+1

是的,的确如此。但这不在迁移范围之内。如果你想要这样的东西,你必须自己写。我在大部分项目中也采用这种方法。 如果您担心如何构建项目或在何处放置这些脚本,则应考虑SSDT。但是在这种情况下,你必须自己编写这些脚本。 –

+0

在Configuration.cs中实现它真的很方便 - 这已经在源代码管理中,并且隐含地与迁移保持一致。我想尽可能自动化。我应该问另一个SO问题:) –

相关问题