0

我開始一個新的ASP.NET項目,並且我試圖按照multi-project approach I've seen mentioned in multiple questions around Stackoverflow在單獨的DAL項目中播種EF數據庫

我一直在遵循this教程,但它只爲您的整個解決方案假設一個項目。最值得注意的是,它建議使用代碼來修改Global.asax文件以設置數據庫初始值設定項。

看到我的DAL項目沒有Global.asax文件,如何爲初始EF數據庫種子設置正確的過程?

+0

.Net 4/Mvc3?你的目標框架是什麼? – Tommy

+0

NET4,MVC3和EF5 –

回答

2

我就站在我的上述評論修正,你將不得不通過二級參考訪問DAL。如果你是真正想在你的web項目引用DAL保持,創建您的BLL一個引導程序的類,它的數據庫的東西你

的例子是從下面的博客帖子拉:http://weblogs.asp.net/rashid/archive/2009/02/17/use-bootstrapper-in-your-asp-net-mvc-application-and-reduce-code-smell.aspx

創建自舉接口

public interface IBootstrapperTask 
{ 
    void Execute(); 
} 

創建一個類,將處理您的數據庫配置

public class InitializeDatabase : IBootstrapperTask 
{ 
    public void Execute() 
    { 
     Database.SetInitializer(new Configuration()); 
     using (var db = new Context()) 
     { 
      try 
      { 
      db.Database.Initialize(false); 
      } 
      catch (DataException ex) 
      { 

      } 
      catch (Exception ex) 
      { 
      throw; 
      } 
     } 
     } 
     } 

創建一個靜態類將執行的任務(你可以有多個,註冊的路線可以移動到BootstrapperTask)

public static class Bootstrapper 
{ 
    static Bootstrapper() 
    { 
     ConfigureContainer(); 
    } 

    public static void Run() 
    { 
     var tasks = ServiceLocator.Current.GetAllInstances<IBootstrapperTask>(); 

     foreach(var task in tasks) 
     { 
      task.Execute(); 
     } 
    } 

    private static void ConfigureContainer() 
    { 
     IUnityContainer container = new UnityContainer(); 

     UnityConfigurationSection configuration = (UnityConfigurationSection) ConfigurationManager.GetSection("unity"); 
     configuration.Containers.Default.Configure(container); 

     ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container)); 
    } 
} 

最後,你的Global.asax將有一個襯墊

protected void Application_Start() 
{ 
    Bootstrapper.Run(); 
} 

還有一些web.config的事情要做,你會在博客文章中看到。另外,this question可以提供更多關於配置細節的信息等。與簡單地不需要引用DAL以及社區周圍的一些優秀帖子有關,爲什麼使用這種模式是一件好事以及幾種不同的實施方法。

+0

cotainer起來可能是一個任務太... – brumScouse

+0

這是非常性感。對於像我這樣來到這裏的其他新手,你可以從[這裏]獲得Unity dll(http://msdn.microsoft.com/zh-cn/library/ff647202)。他們沒有包含在我的VS2010安裝中。 –

2

在Global.asax的Application_Start

Database.SetInitializer(new Configuration()); 
using (var db = new Context()) 
{ 
    try 
    { 
     db.Database.Initialize(false); 
    } 
    catch (DataException ex) 
    { 

    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 

文意類生活在DAL

public class Context : DbContext 
{ 
    public Context() : base("YourDatabaseName") { } 
    public DbSet<Employee> Employees { get; set; } 

    // ... 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new EmployeeMap()); 

你做一個專門的類public class EmployeeMap : EntityTypeConfiguration<Employee>的映射。

播種在DAL完成:

public sealed class Configuration : DropCreateDatabaseAlways<Context> 
{ 
    protected override void Seed(Context context) 
    { 
     // Do your seeding here 
    } 
} 
+0

3層系統的目標不是Web項目不需要依賴於DAL,但是?只有BLL? –

+1

Web - > BLL - > DAL其中 - >重新呈現對項目的引用。當你編譯時,Web項目會說,嘿,我需要BLL構建,因爲我參考了它。當BLL構建時,它會說嘿,我需要DAL,因爲我引用它。最終結果是,所有三個.dll都將出現在最終的Web項目構建中。僅僅因爲它沒有直接依賴DAL,並不意味着它不會成爲最終項目的組成部分。全球。asax仍然可以訪問命名空間,等等。 – Tommy

+0

也許我的理解不正確,或者我太依賴智能感知,但是我無法通過Global.asax文件訪問我的DAL命名空間/項目,而無需添加DAL項目作爲Web項目的依賴項。 –

相關問題