我正在使用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如何工作的人。我认为必须在调用基本连接字符串之前调用它,但它似乎有效。无论如何,我只测试了插入实体实例。我还没有尝试改变模型或更复杂的东西。
答案 0 :(得分:1)
您可以在任意位置使用SetInitializer。通常是在上下文的静态构造函数中,因为它是静态的。
System.Data.Entity.Database.SetInitializer(...);
通常在您第一次访问上下文函数时调用(不足以创建上下文)。通常在第一次阅读时或首先是SaveChanges。
您还可以使用CodeDom和CodeTypeConstructor而不是CodeContructor生成一个静态构造函数。