我可以使用基本字符串而不是静态构造函数在上下文构造函数中调用Database.SetInitializer吗?

时间:2015-07-03 00:19:22

标签: c# entity-framework constructor codedom

我正在使用Entity Framework来存储使用Codedom在运行时生成的一些实体。我实际上也在使用Codedom动态创建我的上下文。在我开始动态生成上下文之前,我使用的是硬编码上下文。这个硬编码上下文类(直到构造函数)的开头看起来像这样:

public class EntityModelContext : DbContext, IEntityRegistry
{
    static EntityModelContext()
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EntityModelContext>());
    }

    public EntityModelContext()
        : base("EntityModelContext")
    {
        EntityToRegisterDictionary = new ConcurrentDictionary<string, Assembly>();
    }

这一切都很好。但是,我尝试使用Codedom生成这个,并发现静态不是Codedom的事情。即使我可以生成一个静态构造函数,我也收到一个错误,基本上说有两个构造函数,我不知道使用哪一个。然后我在我的Codedom生成的上下文类中合并了这两个构造函数,它现在看起来像这样(注意它被称为TreeContext,因为我正在为我创建的每个实体创建一个上下文,而我正在创建一个树实体在我的测试中使用它):

TreeContext() : 
        base("TreeContext")
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<TreeContext>());
    EntityToRegisterDictionary = new ConcurrentDictionary<string, Assembly>();
}

我刚试过运行一个测试,它生成一个树实体类和这个树实体的一个实例,以及相应的树上下文类和这个树上下文的一个实例。我尝试将此树实体实例插入到树上下文实例中,它似乎在SQL Server中有效。因此我猜构造函数是有效的。但是,我想确保与其他更了解Database.SetInitializer如何工作的人。我认为必须在调用基本连接字符串之前调用它,但它似乎有效。无论如何,我只测试了插入实体实例。我还没有尝试改变模型或更复杂的东西。

1 个答案:

答案 0 :(得分:1)

您可以在任意位置使用SetInitializer。通常是在上下文的静态构造函数中,因为它是静态的。

System.Data.Entity.Database.SetInitializer(...);

通常在您第一次访问上下文函数时调用(不足以创建上下文)。通常在第一次阅读时或首先是SaveChanges。

您还可以使用CodeDom和CodeTypeConstructor而不是CodeContructor生成一个静态构造函数。