我一直在使用MigrateDatabaseToLatestVersion
作为数据库初始化程序,以便将Seed
方法用于迁移。
为了在EF中了解有关DBinitializers的更多信息,请查看this博客文章。我不知道这篇文章是否与EF6有关,但我认为这是一个很好的概述。
在对数据库初始化的线程安全性和可能的竞争条件进行研究之后,我对数据库初始化和播种的线程安全性和一致性有一些疑问。
1)首先,数据库初始化是否是线程安全的?我使用MigrateDatabaseToLatestVersion
并在同一AppDomain中创建多个线程(每个线程创建一个新的DbContext)。当我启动应用程序时,这些线程中的第一个应该初始化数据库(并且我认为第一次在AppDomain中播种它)。在这种情况下,同一AppDomain中的不同线程之间是否存在任何竞争条件?据说初始化在单个AppDomain中是线程安全的吗?
2)此外,在SaveChanges()
方法中多次调用Seed
是一种好习惯。例如:我有一个规范化的数据库,其中包含许多通过外键与其他表连接的表。如果我逐个播种每个表并在同一个表中对每个表调用SaveChanges()
,是否可能导致任何问题。对于前者是否有可能另一个AppDomain中的另一个IDbInitializer
同时填充这些表?
3)据我所知MigrateDatabaseToLatestVersion
每个AppDomain运行一次Seed
方法。因此,这意味着即使在同一个应用程序中,每个新的AppDomain实例都会尝试播种相同的数据库,这可能是我认为的性能瓶颈。有什么方法可以阻止这种情况吗?