6

メインの MVC3 Web アプリケーションに含めるモジュールを作成しました。モジュールは NuGet パッケージにパッケージ化されており、NuGet を介してインストールおよびアンインストールできます。メイン サイトとモジュールの両方で Code First を使用し、EF >= 4.3

パッケージを作成するには、別の MVC3 サイトがあり、すべての機能が領域内にあるため、パッケージを作成するには、ライブラリ、ビュー、および必要なすべてのファイルをパックするだけです。データベースの移行はプロジェクトで正常に機能し、パッケージは適切に作成されます。

ここで、NuGet を介してメイン サイトにパッケージをインストールします。このサイトは別のソリューションにあり、ソリューションには 2 つのプロジェクトがあります。

  • MyProject.Web.UI: これは Mvc3 プロジェクトです
  • MyProject.EntityFramework: これは、すべてのモデル、MyProject の dbContext を含むクラス ライブラリです...

パッケージが正しくインストールされ、エリア、エリア ビュー、およびライブラリが正しくインストールされます。

問題は、データベースをどのように更新するかです。最初に「Update-Database」を実行しようとしましたが、次のメッセージが表示されます。

「アセンブリ 'MyProject.Web.UI' に移行構成タイプが見つかりませんでした。(Visual Studio では、パッケージ マネージャー コンソールから Enable-Migrations コマンドを使用して、移行構成を追加できます)。」

次に、「Enable-Migrations」で移行を有効にしようとしましたが、次のメッセージが表示されました。

「アセンブリ 'MyProject.Web.UI' にコンテキスト タイプが見つかりませんでした。」

また、サイトを実行して、変更が自動的に適用されるかどうかを確認しようとしましたが、典型的なメッセージを含む例外ページが表示されます。

「データベースが作成されてから、'NugetPackageDbContext' コンテキストをサポートするモデルが変更されました。Code First Migrations を使用してデータベースを更新することを検討してください」

NuGet パッケージに含まれる移行で必要な変更をデータベースに反映させるために何をすればよいかわかりません。この問題に光を当てることができる人はいますか?私は移行にまったく慣れていません。コンソールでコマンドを実行する代わりに、変更があった場合にデータベースを更新するための構成がいくつかあるかもしれません。少し迷っています。

前もって感謝します :)

4

4 に答える 4

2

朗報です!もらったそうです。NuGet パッケージを作成してデータベースを最新バージョンに更新する方法を探していました。

このパッケージには Admin コントローラーが付属しているので、Update という新しいアクションを追加しました。

public ActionResult Update()
    {
        System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<MyPackageDbContext, MyPackage.Migrations.Configuration>());
        return View();
    }

移行のための構成クラスには、次のものがあります。

public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

このすべてを行う方法で、いくつかの奇妙な動作を見つけたと言わざるを得ません。私を驚かせたのはこれです。これが正常かどうかはわかりません。次のセクションを読んでください。

  1. パッケージは新しい移行でインストールされましたが、データベースは最新ではありません。したがって、この影響を受ける EF にアクセスすると、これに関する例外が発生します。ここまでOK。
  2. アクション /MyPackage/Admin/Update に移動して実行します。どうやらそれは実行されます。データベースにアクセスしましたが、変更が表示されません。migrations テーブルにも新しい行はありません。
  3. 前に例外を表示した EF 部分 (ポイント番号 1) に再度アクセスすると、すべてが完了し、データベースが更新され、移行テーブルに新しい行が表示されます。

注意すべきことの 1 つは、Configuration クラスが内部クラスであることですが、これは別のアセンブリからアクセスできるようにする必要があるモジュールであるためです。公開しようとしましたが、関連しているかどうかわからない奇妙な警告/エラーが表示されました。結局、私はそれを内部に留めましたが、使用しました

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("OtherAssembly")]

NuGet パッケージ、CF、移行など、Visual Studio で奇妙な動作がいくつか見つかりました...これらがバグかどうかはわかりませんが、これらすべてに丸 2 営業日かかりました。

更新可能な CF NuGet パッケージを作成したい他の人に役立つことを願っています。

于 2012-09-28T13:28:14.710 に答える
1

パッケージ マネージャー コンソールでは、既定のプロジェクトを実行する必要があります。MyProject.EntityFramework

MyProject.Web.UIがスタートアップ プロジェクトとして設定されていることを確認する必要がある場合もあります(複数ある場合)。その後、接続文字列を更新コマンドに渡すことができます。

Update-Database -ConnectionStringName MyConnStringName

これにより、失われるデータがない限り、データベースが正しく更新されます。

于 2012-09-27T16:11:24.207 に答える
0

にある場合DbContextは、使用する前にMyProject.EntityFrameworkパッケージ マネージャー コンソールの既定のプロジェクトを に設定する必要があります。MyProject.EntityFrameworkUpdate-Database

于 2012-09-27T16:03:23.210 に答える