1

EF Code First DbContext、データをシードするカスタム初期化子、Global.asax の Application_Start 部分に初期化子を設定するブートストラップ静的クラスがあります。

イニシャライザは次のようになります。

public class DropCreateDatabaseWithSeedData : DropCreateDatabaseAlways<MyEntities>
{
    protected override void Seed(MyEntities context)
    {
        context.Genders.Add(new Gender { Id = 1, Name = "Male", SortOrder = 1 });
        context.Genders.Add(new Gender { Id = 2, Name = "Female", SortOrder = 2 });
        context.Genders.Add(new Gender { Id = 3, Name = "Prefer not to say", SortOrder = 3 });
    }
}

ブートストラップの静的クラスは次のようになります。

public static class Bootstrap
{
    public static void InitialiseDataAccessLayer()
    {
        Database.SetInitializer(new DropCreateDatabaseWithSeedData());
        var uow = new UnitOfWork();
        uow.Context.Database.Initialize(force: true);
    }
}

Global.asax Application_Start は次のようになります。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

        DataAccess.Infrastructure.Bootstrap.InitialiseDataAccessLayer();
    }

すべてが正常に見えますが、データベースの初期化は行われていません。既存のデータベースをまったく使用せずにアプリケーションを実行すると、SqlClient 例外が発生します。

A System.Data.SqlClient.SqlException was thrown: "Cannot open database MyEntities requested by the login.  The login failed.  Login failed for user 'localdev'."

ユーザー localdev には SQL Server へのフル アクセス権があり、SSMS を使用してその SQL Server にログインし、データベースの作成、削除、更新などを正常に行うことができます。

既存の空のデータベースでアプリケーションを実行すると、アプリケーションは実行できる最初のクエリ (この場合はいくつかのユーザー検証クエリ) を実行しようとし、「無効なオブジェクト」例外で失敗します。存在しません。

既存のデータベースなしで uow.Context.Database.Create() を実行すると、データベースは実際に作成されますが、シード データは挿入されません。

イニシャライザを DropCreateDatabaseAlways に変更すると、初期化は行われません。

上記のすべてのコード行でブレークポイントがヒットしているため、すぐにスキップされるものはありません。ヒットしていない唯一のブレークポイントは初期化子のシード メソッドであるため、呼び出されることさえありません (初期化の場合は驚くことではありません)。起こっていません!)。

この時点で、私はアイデアがありません。すべてが本来あるべきように設定されていますが、データベースの初期化は行われていません。

4

1 に答える 1

0

ムー、

への呼び出しInitialiseDataAccessLayer()は正しいように見えますDatabase.SetInitializer(new DropCreateDatabaseWithSeedData());Database.SetInitializer(new DropCreateDatabaseWithSeedData());ApplicationStart.

はインスタンス化されUnitOfWorkませんが、シードしているため、現時点でそれを行う必要があるかどうかはわかりません。

他に何もなければ、別のアイデアです。

于 2013-02-28T15:00:14.033 に答える