1

N DataContexts を持つはずのプロジェクトを構築しています。App-Start (Global.asax) で以下の手順を実行する Web アプリケーションがあります。

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()
    {
    }
}

覚えておいてください、アプリケーションを2回実行すると、データベースが正常に作成および更新されます(他の移行でテストし、テーブルなどを作成しました)。例外は、アプリケーションが初めて実行されたときにのみスローされ、データベースは存在しません。

また、移行更新コードを実行する前に、Database.SetInitializer と context.CreateIfNotExist() を呼び出そうとしました。

編集:

SQL Server ログを確認しました。基本的に、アプリケーションは接続文字列で指定された初期カタログに接続しようとしていますが、存在しません。ただし、例外がスローされた後、データベースが作成されてオンラインになります。

編集:

Initial Catalog プロパティを削除すると機能しますが、すべての dataContexts が master データベースにテーブルを作成することになります。

N 個のサーバー インスタンスを使用することもできますが、コンテキスト間には何らかの分離がありますが、同じ SQL インスタンスでコンテキストごとに 1 つのカタログを取得しようとしています。

4

1 に答える 1

0

わかりましたので、これに対する解決策を見つけました..それはコード化されたものではありませんが、現在は機能しています。

私がしなければならなかったことは

  1. プロジェクトに新しい WCF サービス レイヤーを作成します。
  2. 「Create&Update」データベース作業をサービス クラスに移動します。
  3. ビジネス ロジック レイヤーで、サービスを使用します。
  4. service.DoWork() メソッドが失敗した場合は、もう一度やり直してください (前に述べたように、2 回目には機能します)

サービスを消費する BLL のコードは次のとおりです。

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;

        }


    }
}
}
于 2012-07-13T16:03:13.930 に答える