0

在关于企业实体框架的 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 如何保留?或者是吗?

4

2 回答 2

0

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

于 2013-11-01T15:48:34.403 回答
0

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

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

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

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

于 2013-11-01T21:27:59.270 回答