我正在使用 EF 5 并试图弄清楚内置数据库初始化程序调用 Seed() 方法的不同之处。这些是我的问题:
1. 什么是仅在模型更改时才为数据库播种的好的初始化程序?
2.如何在web.config中配置每个db初始化器?
澄清我的第一个问题:
到目前为止,我知道这些是 EF 5 的内置数据库初始化程序:
- 将数据库迁移到最新版本
- CreateDatabaseIfNotExists
- DropCreateDatabaseIfModelChanges
- DropCreateDatabaseAlways
我的问题是理解何时调用每个初始化程序的 Seed 方法。我查看了 EntityFramework dll 的内部,并检查了每个初始化程序的 InitializeDatabase() 方法的代码,以检查每个方法的调用时间。这是我发现的:
MigrateDatabaseToLatestVersion:我无法确定何时调用种子方法,但从我的测试来看,每次应用程序运行时都会调用它,无论模型是否有变化。
CreateDatabaseIfNotExists:我发现只有在创建数据库时才调用 Seed 方法。如果存在,则不应做任何种子。
DropCreateDatabaseIfModelChanges:似乎 InitializeDatabase 方法每次都会调用 Seed(),无论模型是否更改。该调用在 if(context.Dabase.Exists()) 检查之外。
DropCreateDatabaseAlways:很明显,这将始终调用 Seed 方法。
这个对吗?如果是这样,我似乎无法将播种限制在模型更改的情况下,我可能应该编写一个自定义初始化程序。
关于我的第二个问题,我知道如何配置 MigrateDatabaseToLatestVersion 但我发现很难写,因为我不知道这个声明的含义(尤其是 '2 部分 - 它是枚举的值,在这种情况下应该如何我想知道其他初始化程序的相应数量是多少?):
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
<contexts>
<context type="Digidata.MP.Data.ObjectContext, Digidata.MP.Data">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Digidata.MP.Data.ObjectContext, Digidata.MP.Data], [Digidata.MP.Data.Migrations.Configuration, Digidata.MP.Data]], EntityFramework"/>
</context>
</contexts>
我在哪里可以找到有关如何在配置文件中声明内置初始化程序的说明?