2012-07-12 49 views
1

建立一個應該有N個DataContexts的項目。 我有一個web應用程序,將執行以下步驟中的應用程序開始(Global.asax):.NET實體框架代碼優先遷移 - 數據庫連接錯誤

1 - 如果數據庫不存在,創建。 2 - 將數據庫更新到最新的遷移。

當我第一次運行應用程序(數據庫尚未創建)時,我得到一個執行選項「無法打開數據庫」DBName「請求登錄。登錄失敗。 用戶登錄失敗'sa' 「。

好的,所以在這一刻我檢查數據庫並創建它,但__Migrations表不存在。

如果我停止應用程序並再次運行該應用程序,則不會拋出異常並且數據庫已成功更新。

我試着在連接字符串中設置持久安全信息,但沒有任何變化。

我的代碼如下: 的Global.asax

void Application_Start(object sender, EventArgs e) 
    { 
     // Code that runs on application startup 
     Bll.AppStart.Databases.Start(); 

    } 

調用..

namespace BusinessLogicLayer.AppStart 
{ 
/// <summary> 
/// Inicialização e Update de versão dos bancos de dados do sistema 
/// </summary> 
public static class Databases 
{ 
    public static void Start() 
    { 
     //Iniciar DBCore 
     DataBaseStart<DataAccessLayer.DataContexts.Core.Context, 
      DataAccessLayer.Migrations.Core.Configuration>(); 
    } 

    #region Inicializar bancos de dados 

    private static void DataBaseStart<T, TC>() 
     where T : DbContext, new() 
     where TC : DbMigrationsConfiguration<T>, new() 
    { 


     //Atualiza a base de dados com base na configuração do migrations 
     try 
     { 

      var migratorConfig = new TC(); 
      var dbMigrator = new DbMigrator(migratorConfig); 
      dbMigrator.Configuration.AutomaticMigrationDataLossAllowed = false; 
      dbMigrator.Update(); 

     } 
     catch (Exception) 
     { 
      //Exceção quando cria o banco a primeira vez? 


      throw new Exception("Banco de dados criado pela primeira vez. Reinicie a aplicação."); 




     } 


    } 

    #endregion 
} 

}

我的上下文類..注意到它定義了一個空數據庫

public class Context : DbContext 
{ 

    public Context() 
    { 
     Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["PODBCore"].ConnectionString; 

    } 
    public Context(string connectionString) 
    { 
     Database.Connection.ConnectionString = connectionString; 

    } 





} 

我的遷移配置類

public sealed class Configuration : DbMigrationsConfiguration<DataContexts.Core.Context> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     AutomaticMigrationDataLossAllowed = false; 
    } 

    protected override void Seed(DataContexts.Core.Context context) 
    { 
     // This method will be called after migrating to the latest version. 

    } 
} 

我有一個定義的空模型

public partial class Initial : DbMigration 
{ 
    public override void Up() 
    { 
    } 

    public override void Down() 
    { 
    } 
} 

只是要記住,如果我跑兩次數據庫已成功創建並更新aplication(我做測試初始遷移與其他遷移,創建表和東西)。 異常僅在應用程序首次運行時拋出,並且數據庫不存在。

我還試圖在運行遷移更新代碼之前調用Database.SetInitializer和context.CreateIfNotExist()。

編輯:

伊夫檢查SQL Server日誌,基本的應用程序試圖連接到連接字符串中指定初始目錄,但它不存在。在引發異常之後,數據庫被創建並在線。

編輯:

如果我刪除初始目錄屬性它將工作,但我有我的所有dataContexts創建在主數據庫中的表。

我們可以有N個服務器實例,仍然有某種上下文,但我還在試圖讓一個目錄上下文在同一個SQL實例

回答

0

好之間的分離,讓我找到了解決這個..它不是最好的編碼,但現在它的工作。

什麼,我要做的就是

  1. 建立在我的項目一個新的WCF服務層。
  2. 將「創建&更新」數據庫工作移至服務類。
  3. 在業務邏輯層,使用該服務。
  4. 如果service.DoWork()方法失敗,再嘗試(正如我之前所說的,它的作品第二次)

這裏是BLL代碼consumig服務

using BusinessLogicLayer.WcfServicesLayer.AppStart.Databases; 

namespace BusinessLogicLayer.AppStart 
{ 
    /// <summary> 
    /// Inicialização e Update de versão dos bancos de dados do sistema 
    /// </summary> 
    public static class Databases 
    { 
    public static void Start() 
    { 
     //Iniciar DBCore 
     var client = new DatabasesClient(); 
     bool databaseStarted = client.DoWork(); 
     if(!databaseStarted) 
     { 
      var retry = new DatabasesClient(); 
      databaseStarted = retry.DoWork(); 
     } 

    } 


    } 
    } 

這裏是服務類。

using System; 
using System.Data.Entity; 
using System.Data.Entity.Migrations; 
namespace WcfServicesLayer.AppStart 
{ 
// Serviço de inicialização dos bancos de dados da aplicação 
public class Databases : IDatabases 
{ 
    public bool DoWork() 
    { 
     return StartDatabases(); 
    } 

    private bool StartDatabases() 
    { 

     //Iniciar DBCore 
     return DataBaseStart<DataAccessLayer.DataContexts.Core.Context, 
      DataAccessLayer.Migrations.Core.Configuration>(); 

    } 

    private bool DataBaseStart<T, TC>() 
     where T : DbContext, new() 
     where TC : DbMigrationsConfiguration<T>, new() 
    { 


     //Atualiza a base de dados com base na configuração do migrations 
     try 
     { 
      var migratorConfig = new TC(); 
      var dbMigrator = new DbMigrator(migratorConfig); 
      dbMigrator.Configuration.AutomaticMigrationDataLossAllowed = false; 

      dbMigrator.Update(); 
      return true; 
     } 
     catch (Exception) 
     { 
      //Exceção quando cria o banco a primeira vez? 
      return false; 

     } 


    } 
} 
} 
相關問題