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

本文关键字:构造函数 调用 SetInitializer 上下文 Database 字符串 我可以 静态 | 更新日期: 2023-09-27 18:00:56

我正在使用实体框架来存储一些在运行时使用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的工作原理。我以为在调用基本连接字符串之前必须调用它,但它似乎起作用了。无论如何,我只测试了插入一个实体实例。我没有试过改变模型或任何更复杂的东西。

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

您可以在需要的地方使用SetInitializer。通常是在上下文的静态构造函数中,因为是静态的。

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

通常在首次访问上下文函数时调用(不足以创建上下文(。通常在第一次读取或第一次保存更改时。

您也可以使用CodeDom和CodeTypeConstructor而不是CodeContractor生成静态构造函数。