在我的Entity Framework Code First项目中,如果我运行
IF NOT EXISTS
命令通过Package Manage Console,我的update-database
方法成功运行。但是,如果我使用-script参数运行命令:
Seed()
...未调用Seed()方法,并且生成的SQL不包含用于为数据库设定种子的SQL命令。这种行为是可重复的。我正在尝试创建一个完整的DB脚本进行部署。
为什么使用update-database -script
运行的SQL命令与没有它的SQL命令之间存在差异,以及在使用-script
时如何让update-database
运行Seed()
方法切换?
答案 0 :(得分: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
实例是在运行时创建的,而Next()是在运行时调用的。你会如何尝试将其编译为SQL?如果您有一个文件并从中读取数据并将其放入数据库,该怎么办?这些是在设计时无法评估的所有事情,仅在运行时(即,如果文件在设计时不在正确的位置,那么仅在运行时它不是问题)。这就是为什么像移植脚手架这样的设计时工具无法对其进行评估的原因。