【问题标题】:EF / Database Initializor / Order of ExecutionEF / 数据库初始化器 / 执行顺序
【发布时间】:2013-11-12 20:26:19
【问题描述】:

在关于企业实体框架的 Julie Lermans 课程中,她创建了一个如下所示的基本上下文类。

Public class BaseContext<Tcontext> : DBContext where Tcontext :DBContext
{
static BaseContext()
{
    Database.SetInitializer<TContext>(null);
}
Protected BaseContext()
:base("connectionStringName")
{}
}

这样使用:

public class xxxContext : BaseContext<xxxContext>
{
public Field A { get;set;}
}

她接着说,因为她的存储库中的数据库初始化看起来像这样

Database.SetInitializer(new MigrateDatabaseToLatestVersion<XXXXContext>())
using (var context = new xxxContext())
(
    Assert.AreEqual(0, context.Customers.Count()));
)

我的问题是: 在最后一段代码中(在此示例中),Database.SetInitializer 首先执行,将 MigrateDatabaseToLatestVersion 设置为初始化程序。但是,在创建上下文时,基类的静态构造函数会在实际创建上下文之前执行 (Database.SetInitializer(null))。当代码到达 context.Customers.Count() 时 - 初始化程序将为 NULL,然后执行默认初始化程序 (CreateIfDatabaseNotExists)。

我错了吗? MigrateDatabaseToLatestVersion 如何保留?还是这样?

【问题讨论】:

    标签: entity-framework entity-framework-6


    【解决方案1】:

    为了回答您的问题,当您调用Database.SetInitializer&lt;TContext&gt;(&lt;ANY_DatabaseInitializer&gt;); 时,上下文的初始化策略会被注册或更新。

    是的,如果您在静态构造函数中设置 Database.SetInitializer(new MigrateDatabaseToLatestVersion&lt;TContext&gt;())', the TContext will set the Strategy toNullDatabaseInitializer 后访问 TContext。这将导致最新的迁移代码保持未执行,并且不匹配会出现异常。

    Moover,看这个链接Entity Framework Code First Web.config Initialization

    变形金刚 对,好吧,如果您要使用 web.config 实体框架初始化,那么您肯定要使用 Web.config 转换。他们只是相处得很好。假设您对本地开发环境有一个特定的初始化策略 - DropCreateDatabaseWhenModelChanges,因此您可以在每次数据库更改时将其删除,然后用一些最少的数据重新植入它。我就是做这个的。显然,您希望在生产中使用相同的东西。只是开个玩笑。那只是个玩笑。您想要 MigrateDatabaseToLatestVersion,或者您可能想要完全关闭初始化。那么如何管理 web.config 中的更改。手动?

    【讨论】:

    • codputer,明明白白的回答,甚至问也是好的。 Julie 可能在您不清楚的上下文(问题领域/范围)中撰写文章。发生!链接到文章并提出问题以澄清困惑或了解更多信息,对所有人都是鼓舞人心的。 “了解更多”是每个人的好奇心。快乐编码...
    • 我完全同意 - 但是课程在 Pluralsight 上的视频中,所以我认为这是提问的最佳方式。然后我给她发了推特,她回复了(见下文)。朱莉有我的尊重,但我们都可能犯错误。我相信这是一个,我只需要确保我知道她非常了解 EF!
    【解决方案2】:

    我想你误会了。我在集成测试中使用 DropCreateDatabaseAlways。不在存储库中! :) 朱莉

    【讨论】:

    • 我意识到 DropCreateDatabaseAlways 可能不是生产系统的好选择:),所以我不能将此标记为答案。我正在寻找操作的顺序。据我所知,这段代码永远不会执行所需的数据库初始化程序。
    • 很公平——我在想一个不同的样本。但我相信您误解(并歪曲)我的指导。我的妈妈是关闭受约束的 dbcontext 类使用的基类中的初始化。在课程中,我还有一个项目负责进行数据库初始化。它的上下文知道所有实体及其关系,而较小的上下文只知道一个子集。该项目中的上下文不继承自基类。所以没有冲突,因此不应该有一个凌驾于另一个之上的问题。
    • 你的权利!我错过了在创建数据库的上下文中,您不是从 Basecontext 继承的,而是从 DBContext 继承的!我认为这很容易错过,我建议在您的视频中突出显示测试方法不使用 Basecontext。此外,对于 EF6,也许还有一个额外的建议是将其推送到配置中?我让两名员工对此进行了审查,我们都很困惑!
    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2022-06-10
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多