放置Database.SetInitializer的地方

时间:2011-12-30 12:43:45

标签: c# asp.net-mvc-3 entity-framework ef-code-first

我正在开发一个最终可能有多个UI版本/变体的项目,但到目前为止,我的解决方案Web中有两个子项目 - 包含ASP.NET MVC的Web界面。服务项目是我定义数据库上下文和模型的地方。

我的目标是在我的Web项目中对EF特定代码的引用最少或可能不引用。我希望它是独立的,所以当我用服务后端切换dll(从假设SQL到XML或MySQL)时,我不应该在我的MVC项目中进行多次修改。

它的外观如下:

Project layout

我的问题是: - 到目前为止,我没有找到在Global.asax之外的其他地方使用Database.SetInitializer的示例。如果模型在我的工厂类似的DatabaseContextProvider类或服务类中更改,从内容中提取数据并将其提供给具有DTO的UI,我想放置数据库重新创建。那个地方有没有缺点? - 我希望可以使用Properties / Settings.settings文件配置上下文的connectionString - 这是否合理?

5 个答案:

答案 0 :(得分:36)

为了避免耦合,我宁愿不在包含DataContext的Assembly之外设置初始化器。所以,我为DataContext添加了一个静态构造函数。这样,引用此程序集的每个项目都将享受初始化程序而无需显式设置它,并且初始化程序每个进程只设置一次。

static MyDataContext()
{
   Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataContext, Configuration>());
}

连接字符串当然将从应用程序配置文件中获取。

答案 1 :(得分:14)

在第一次使用Database.SetInitializer之前,您需要一种机制来调用DbContext方法。这就是为什么它通常在Global.asax文件中调用。

您可以在tm.Service项目中使用初始化方法创建一个类,并使用Application_Start方法调用它,并将Database.SetInitializer放入该初始化方法中。

可以从设置文件中提供连接字符串。

答案 2 :(得分:9)

我把它放在DbContext构造函数上并为我工作。

public myDbContext() : base(connectionToDatabase) {
        Database.SetInitializer<myDbContext>(null);
    }

上述解决方案可行,但效率不如以下代码:

  protected void Application_Start()
    {
        Database.SetInitializer<myDbContext>(null);
    }

在我的情况下,我没有在UI上引用我的DAL,因此我所做的是,我创建了一个EntityFramework配置并使用反射注册我的设置。

 protected void Application_Start()
    {           
        EntityFrameworkConfig.RegisterSettings();
    }


 public static class EntityFrameworkConfig
{
    public static void RegisterSettings()
    {
        // Use the file name to load the assembly into the current
        // application domain.
        Assembly a = Assembly.Load("MyAssembly");
        // Get the type to use.
        Type myType = a.GetType("MyType");
        // Get the method to call.
        MethodInfo myMethod = myType.GetMethod("MySettingsMethod");
        // Create an instance.
        object obj = Activator.CreateInstance(MyType);
        // Execute the method.
        myMethod.Invoke(obj, null);
    }
}

  public void Configurations()
    {
      //Other settings
        Database.SetInitializer<myDbContext>(null);
    }

<强>更新

使用Entity Framework 6,现在可以使用NullDatabaseInitializer

Database.SetInitializer(new NullDatabaseInitializer<MyDbContext>());

答案 3 :(得分:3)

对于EF6以来,Microsoft使得在应用程序的配置文件中为每个数据库上下文配置一个初始化程序成为可能。请参阅此Microsoft页面的最后一部分:https://msdn.microsoft.com/en-us/data/jj556606.aspx

这就像&#34; Global.asax&#34;方法,具有例如单元测试项目可以为同一个数据库上下文使用不同的初始化程序。

答案 4 :(得分:0)

单击Global.asax页面,找到Application_Start()方法。请在此方法之后通过以下代码。为了支持此代码,请使用System.Data.Entity;

Database.SetInitializer<namespace.modelclass>(null);