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

时间:2017-04-12 10:39:52

标签: entity-framework entity-framework-6

我一直在使用MigrateDatabaseToLatestVersion作为数据库初始化程序,以便将Seed方法用于迁移。

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

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

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

2)此外,在SaveChanges()方法中多次调用Seed是一种好习惯。例如:我有一个规范化的数据库,其中包含许多通过外键与其他表连接的表。如果我逐个播种每个表并在同一个表中对每个表调用SaveChanges(),是否可能导致任何问题。对于前者是否有可能另一个AppDomain中的另一个IDbInitializer同时填充这些表?

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

0 个答案:

没有答案