67

実行したいプロジェクトが 1 つありますupdate-databaseが、別のプロジェクトにモデルとコンテキストがあります。

実行するenable-migrationsと、次のエラーが発生します。アセンブリ 'MyProject' にコンテキスト タイプが見つかりませんでした。

これはおそらく、私の Context が MyProject.MVC にあるためです。

enable-migrationsMyProject.MVC に対して実行する場合は、アプリ構成ファイルを追加する必要があります。多くのプロジェクトでコードを使用したいので、私はそれをしたくありません。

それで、MyProject に対して実行enable-migrationsして、どういうわけか MyProject.MVC でコンテキストを調べるように指示できますか?

4

5 に答える 5

108

これは EF 6 でのみ機能しますが、コマンドにパラメーターを追加したリリースがありました。このコマンドを使用すると、次のことができます。-ContextProjectName-enable-migrations

enable-migrations -ContextProjectName MyProject.MVC -StartUpProjectName MyProject.MVC 
-ContextTypeName MyProject.MVC.MyContextFolder.MyContextName -ProjectName MyProject

MyProjectこれにより、 のコンテキストを使用してプロジェクトに移行が追加されますMyProject.MVC。移行を含むプロジェクトに、コンテキストを含むプロジェクトへの参照、つまり参照があることを確認する必要がありMyProjectますMyProject.MVC

于 2013-08-08T14:33:04.253 に答える
12

Database Context クラスを含むプロジェクトでのみ「Enable-Migrations」を実行できます。

ソリューションには 2 つのプロジェクトが含まれます。

1) MyProject.Models
    |- Migrations
        |- 201401061557314_InitialCreate.cs
        |- Configuration.cs
    |- MyContext.cs
    |- App.config (no connection string)


App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>


2) MyProject.MVC
        |- Filters
            |- InitializeSimpleMembershipAttribute.cs


InitializeSimpleMembershipAttribute.cs

namespace MyProject.MVC.Filters
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
    {
        private static SimpleMembershipInitializer _initializer;
        private static object _initializerLock = new object();
        private static bool _isInitialized;

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Ensure ASP.NET Simple Membership is initialized only once per app start
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
        }

        private class SimpleMembershipInitializer
        {
            public SimpleMembershipInitializer()
            {
                try
                {
                    Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, MyProject.Model.Migrations.Configuration>());

                    using (var context = new MyContext())
                    {
                        context.Database.Initialize(force: true);
                        if (!context.Database.Exists())
                        {
                            // Create the SimpleMembership database without Entity Framework migration schema
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                        }
                    }

                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                }
            }
        }
    }
}

MyProject.MVC をスタートアップ プロジェクトとして設定する

パッケージ マネージャーで、プロジェクトを選択します: MyProject.Models

次に、「Enable-Migrations」を実行して、MyProject.Models に「Migrations」フォルダーを作成します。

続いて "Update-Database" -> 移行では、スタートアップ プロジェクトの Web.config の接続文字列を使用して移行を実行します。

于 2014-01-16T16:53:25.783 に答える
3

回避策は次のとおりです。

クラスを MyProject (移行用のプロジェクト) に追加します。このクラスが dbcontext (MyProject.MVC にあるもの) を継承するようにします。

次に、MyProject で EF 移行コマンドを実行します。

于 2017-02-10T16:44:48.453 に答える
0

同じ問題があり、EntityFramework 4.3.1 を使用しています。EF6 はこの問題を解決しているようですが (@SOfanatic の回答によると)、いくつかの重大な変更 (DataAnnotations など) のため、EF6 にアップグレードしたくありませんでした。

それで、これを解決するために私がしたこと(およびその過程で学んだこと):

  1. 新しいソリューション (空のプロジェクト) を作成し、移行を有効にするモデルがあるプロジェクトを追加します (この場合は MyProject.MVC)。既存のプロジェクトを追加する前に、必要な NuGet パッケージをインストールする必要がある場合があります。

  2. 接続文字列を含む構成ファイルを追加します (心配しないでください。これは、移行エンジンをだますためだけです)。既存のデータベースをモデル プロジェクトの出力フォルダー (この場合は MVC\bin\Debug である必要があります) にコピーします。構成ファイルの接続文字列がそのデータベースを指していることを確認してください。

    <connectionStrings>
        <add name="MyDB" providerName="System.Data.SqlServerCe.4.0" connectionString="DataSource=|DataDirectory|\MyDB.sdf"/>
      </connectionStrings>
    
  3. 新しいソリューションを使用しているため、モデル プロジェクトをスタートアップ プロジェクトとして設定します (既定のプロジェクトは削除できます)。

  4. パッケージ マネージャー コンソールで enable-migrations コマンドを実行します。Configuration.cs とタイムスタンプ付きの InitialCreate.cs ファイルの 2 つのファイルを含む Migrations フォルダーを作成する必要があります。InitialCreate があると便利です。そのため、既存のデータベースをモデル プロジェクトの出力フォルダーに配置します (ただし、これはオプションです)。

  5. これらの変更が更新されるように、元のソリューションをリロードします。

私が学んだこと(私が理解している限り):

  1. 移行エンジンが機能するには、有効な接続のように見えるものが必要です。コードで (別のプロジェクトで) 接続文字列を作成していましたが、うまくいきませんでした。移行エンジンを機能させるために、「有効な」接続文字列を指定しました。
  2. 移行エンジンが検出できる場所 (モデル プロジェクトの出力フォルダー) にデータベースを配置して、移行の開始点を作成します。この開始点は、基本的に移行 API で記述されたデータベース スキーマです。
  3. 移行が設定されたら、すべてを以前の状態に復元でき、問題なく動作します。
  4. 移行を手動で追加するたびに、最初と同じように、移行エンジンを再度「だます」必要があります。自動移行は試していませんが、このアプローチもうまくいくと思います。

ところで、私は SQL Server CE 4.0 データベースを使用しているため、標準の SQL Server DB や LocalDB と比較すると、接続文字列に関するいくつかの点が少し変わっています。それ以外はすべて同じです。

これがお役に立てば幸いです。この移行の仕組みについて詳しく知っている場合は、コメントしてください。

于 2013-10-26T11:09:34.970 に答える