1

これは他のチェーンである程度カバーされていることは知っていますが、ニーズに合わせて補間した後でも、まだ問題が発生しています。多くの人が知っているように、ドキュメントは事実上存在しません。したがって、どんな助けも大歓迎です。

EF エンティティを含む DLL から DB スクリプトを生成するだけの汎用メソッドを作成しようとしています。次に、DLL パスと、App.config で定義された接続文字列の名前を渡します。初めて、スクリプトは正常に生成されます。SQLServer Studio で実行すると、すべてのテーブルなどが生成されます。ただし、2 回目に実行すると (DB が存在します)、ScriptUpdate メソッドで次のエラーが発生して失敗します。

アプリケーション構成で指定された DbContext タイプ 'AdminovateLibrary.Repository.EntityDbContext、Adminovate.AdminovateLibrary-Project' のタイプ 'Disabled' のデータベース初期化子を設定できませんでした。詳細については、内部例外を参照してください。

内部例外は次のとおりです:「ファイルまたはアセンブリ 'MyLibrary' またはその依存関係の 1 つを読み込めませんでした。指定されたファイルが見つかりません。

DLL に最初の実行とまったく同じコードが含まれている場合、メソッドは空の文字列を生成するはずです。ただし、変更した DLL で実行しても、同じエラーが発生します。

私のコードは次のとおりです。

    public string GenerateUpdateSchemaScript( string sourceDllFilePath, string targetConnectionName ) {
        var dbMigrationsConfiguration = CreateConfiguration( sourceDllFilePath, targetConnectionName );
        var dbMigrator = new DbMigrator( dbMigrationsConfiguration );

        Database.SetInitializer( new CreateDatabaseIfNotExists<DbContext>() );

        var scriptor = new MigratorScriptingDecorator( dbMigrator );
        var script = scriptor.ScriptUpdate( null, null );
        return RemoveCreateMigrationHistoryTable( dbMigrationsConfiguration, script );
    }

    private static DbMigrationsConfiguration CreateConfiguration2( string sourceDllFilePath, string targetConnectionName ) {
        var assembly = Assembly.LoadFrom( sourceDllFilePath );
        var configType = assembly.GetTypes().Single( type => typeof( DbMigrationsConfiguration ).IsAssignableFrom( type ) );
        var configuration = ( DbMigrationsConfiguration )assembly.CreateInstance( configType.FullName );
        if( configuration != null ) {
            configuration.ContextType = assembly.GetTypes().Single( type => type.BaseType == typeof( DbContext ) );
            configuration.MigrationsAssembly = assembly;
            configuration.TargetDatabase = new DbConnectionInfo( targetConnectionName );
            configuration.AutomaticMigrationsEnabled = true;
            configuration.AutomaticMigrationDataLossAllowed = true;
        }
        return configuration;
    }
4

0 に答える 0