EF 中的多线程和迁移 (MigrateDatabaseToLatestVersion)

Den*_*niz 5 entity-framework entity-framework-6

我一直在MigrateDatabaseToLatestVersion用作数据库初始值设定项,以便在Seed迁移中使用方法。

为了了解有关 EF 中 DBinitializers 的更多信息,我查看了这篇博客文章。我不知道这篇文章是否仍然与 EF6 相关,但我认为提供了一个很好的概述。

在研究了数据库初始化的线程安全性和可能的​​竞争条件后,我对数据库初始化和播种的线程安全性和一致性有一些疑问。

1)首先数据库初始化是否线程安全?我MigrateDatabaseToLatestVersion在同一个 AppDomain 中使用和创建多个线程(每个线程创建一个新的 DbContext)。当我启动应用程序时,这些线程中的第一个应该初始化数据库(并且我认为也是第一次在 AppDomain 中播种)。在那种情况下,同一个 AppDomain 中的不同线程之间可能存在任何竞争条件吗?据说在单个 AppDomain 中初始化是线程安全的?

2)此外,多次调用SaveChanges()Seed方法是否是一种好习惯。例如:我有一个规范化的数据库,其中包含许多通过外键与其他表连接的表。如果我对每张桌子一一播种SaveChanges()并在同一张桌子上调用它们中的每一个,是否可能造成任何麻烦。例如。IDbInitializer另一个 AppDomain 中的另一个是否可以同时填充这些表?

3)据我所知,每个 AppDomainMigrateDatabaseToLatestVersion运行Seed一次该方法。所以,这意味着即使在同一个应用程序中,每个新的 AppDomain 实例都会尝试为同一个数据库播种,我认为这可能是一个性能瓶颈。有什么办法可以防止这种情况吗?