1

EF Code First を使用して、開発段階で最初にデータベースを作成しました。プロジェクトをサーバー上のステージング環境に移動したとき、特定のフェーズでデータベースを変更または削除しないようにするための小さなハックを含めました。(したがって、既存のデータベースに接続します)。プロジェクトの簡単なコピーを作成し、サーバー上の別の場所にホストして、ステージング バージョンとライブ バージョンを同時に実行しようとしていますが、web.config で設定できると想定した 2 つの異なるデータベースを使用しています。ある場所から実行すると動作しますが、別の場所ではアプリケーション プールが失敗します

A process serving application pool 'XYZ' suffered a fatal communication error with the Windows Process Activation Service. The process id was '1234'. The data field contains the error number.

Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7a5f8
Faulting module name: ntdll.dll, version: 6.1.7601.17725, time stamp: 0x4ec49b8f
Exception code: 0xc00000fd
Fault offset: 0x0002e04e
Faulting process id: 0x1d98
Faulting application start time: 0x01ce1b29dcf57530
Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe
Faulting module path: C:\Windows\SysWOW64\ntdll.dll
Report Id: 1fd4a0b0-871d-11e2-a272-be31a5415ec8

アイデアや提案はありますか?

コードに関する詳細:

Global.asax - Application_Start

if (DAL.General.Helpers.Phase == "Live") {
    Database.SetInitializer<MyContext>(new MyContextProductionInitialiser());
} else {
    Database.SetInitializer(new MyContextInitialiser());
}

MyContextProductionInitialiser

public class MyContextProductionInitialiser : IDatabaseInitializer<MyContext>
{
    public void InitializeDatabase(MyContext context)
    {
        if (!context.Database.Exists())
        {
            throw new System.Configuration.ConfigurationErrorsException("Database does not exist");
        }
    }
}

MyContextInitialiser

public class MyContextInitialiser : DropCreateDatabaseIfModelChanges<MyContext> {...}

マイコンテキスト

public MyContext() : base("name=MyContextConnectionString") {
    Database.Initialize(false);
}

** Web.config **

<connectionStrings>
    <add name="MyContextConnectionString" connectionString="Server=.;Database=database_staging;User Id=sa;Password=password;" providerName="System.Data.SqlClient " />
</connectionStrings>

データベース: ステージング データベースとライブ データベースに共有 SQL ログイン ユーザーを使用しています。

アプリケーション プール: IIS 7.5 では、2 つの別個の同一のアプリケーション プールが実行されています。どちらも v4.0 統合です。

編集 データベース名を元のデータベース名とまったく同じになるように更新すると、機能します。これを修正するにはどうすればよいですか?

4

1 に答える 1

0

スタック オーバーフローが原因で、ワーカー プロセスがクラッシュしています。まだ調査中ですが、データベースへの書き込み時に次の例外がスローされCannot insert the value NULL into column 'ID', table 'XYZ'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated.ます。エラーが発生すると、エラー テーブルに書き込むため、SO とワーカー プロセスがクラッシュします。

何らかの理由で SQL の構成方法に問題があり、データベースの単純な復元を行うことができないため、単純にデータベースを削除し、オブジェクトのスクリプトを作成して再作成し、必要なテーブルを再構成しました。

教訓: ワーカー プロセスがクラッシュした場合、それには十分な理由があります。この場合、StackOverflow は完全に理にかなっています。

于 2013-03-09T11:35:43.383 に答える