2017-02-12 19 views
13

に私はそれを適切に設定する方法がわからコード最初の移行を行うには好きですが、ないとジミー・ボガードのContosoUniversityCore projectどのようにASP.NETコアとセットアップEF6の移行を

を採用しようとしています。 Migrator.EF6.Toolsをプロジェクトに追加しました。

私は 有効-マイグレーションを実行すると、私はこのエラーを取得する:ここ

Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not 
marked as serializable." 
At C:\Users\SomeUser\.nuget\packages\entityframework\6.1.3\tools\EntityFramework.psm1:718 char:5 
+  $domain.SetData('project', $project) 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : SerializationException 

Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not 
marked as serializable." 
At C:\Users\SomeUser\.nuget\packages\entityframework\6.1.3\tools\EntityFramework.psm1:719 char:5 
+  $domain.SetData('contextProject', $contextProject) 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : SerializationException 

Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not 
marked as serializable." 
At C:\Users\SomeUser\.nuget\packages\entityframework\6.1.3\tools\EntityFramework.psm1:720 char:5 
+  $domain.SetData('startUpProject', $startUpProject) 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : SerializationException 

System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Data.Entity.Migrations.Extensions.ProjectExtensions.GetPropertyValue[T](Project project, String propertyName) 
    at System.Data.Entity.Migrations.MigrationsDomainCommand.GetFacade(String configurationTypeName, Boolean useContextWorkingDirectory) 
    at System.Data.Entity.Migrations.EnableMigrationsCommand.FindContextToEnable(String contextTypeName) 
    at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0() 
    at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) 
Object reference not set to an instance of an object. 

答えて

6

本当の問題は、異なるEF「味」があるということです。ただ、EFルートのドキュメントに移動して、違いを参照してください。

ここ

はEF 6と.NETのコアに移行を使用するための私のレシピです:あなたは.csprojにこれらの行を追加する必要があります

1st.-:

<ItemGroup> 
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.1" /> 
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.1" /> 
</ItemGroup> 

注:バージョンが持っています

:このようなあなたのプロジェクトのコンテキストを作成2nd.-

を変更

public class YourContext : DbContext { #region Constructors public YourContext() { } public YourContext(DbContextOptions options) : base(options) { } #region DbSets // YOUR DB SETS GO HERE... #endregion DbSets #region OnConfiguring // THIS HELPED ME A LOT: protected override void OnConfiguring(DbContextOptionsBuilder options) { // In order to be able to create migrations and update database: if (!options.IsConfigured) { options.UseSqlServer("YourLocalConnectionStringShouldBeHere"); } base.OnConfiguring(options); } #endregion #region Model Creating protected override void OnModelCreating(ModelBuilder modelBuilder) { // Your Model Crerating Stuff } #endregion Model Creating } 

3rd.- マイグレーション ADD:

dotnet ef migrations add [NameOFYourMigrationGoesHere] -c YourContext 

注:CMD、タイプから

プロジェクトフォルダに移動し、をする追加作成したファイルに忘れてはいけませんソース管理、それは自動的に行われていません

4rd.- あなたのDBの更新: 4.a.- ドッキングイン - >プロジェクトを(Dockerを使用して)実行すると、最初のコンテキストの使用時に移行が適用されます。

注:

4.b.-

あなたのローカルDB(それは、その環境用に構成された接続文字列を使用します) - >(CMDコンソールから)ConfigurationContext.OnConfigureと実行でハードコードの接続文字列を編集します:

dotnet ef database update --context ConfigurationContext 

私はあなたに役立つことを願っています。

フアン

+0

'Microsoft.EntityFrameworkCore.Tools.DotNet'と' OnConfiguring'はEF7機能のみです。あなたはEF6.1.3の解決法を提供しませんでした。 – Shimmy

1

あなたのEF6プロジェクトはIDbContextFactoryの実装を提供する必要があります。 EF6コマンドラインツールは、その実装を見つけて使用し、コンテキストをインスタンス化することができます。ここに例があります。コア・プロジェクトのStartup.csファイルで

public class SchoolContextFactory : IDbContextFactory<SchoolContext> 
    { 
    public SchoolContext Create() 
    { 
     return new EF6.SchoolContext("Server=(localdb)\\mssqllocaldb;   Database=EF6MVCCore;Trusted_Connection=True;MultipleActiveResultSets=true"); 
    } 
    } 

、ConfigureServicesに依存性注入(DI)用のEF6コンテキストを設定します。 EFコンテキストオブジェクトは、要求ごとの有効期間の有効範囲に含める必要があります。

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 
    services.AddScoped<SchoolContext>(_ => new SchoolContext(Configuration.GetConnectionString("DefaultConnection"))); 
} 

両方のプロジェクトのパッケージマネージャコンソール(PMC)で、Install-Package Entityframeworkコマンドを実行します。

クラスライブラリプロジェクトで、データモデルクラスとコンテキストクラス、およびIDbContextFactoryの実装を作成します。

クラスライブラリプロジェクトのPMCでは、Enable-MigrationsコマンドとAdd-Migration Initialコマンドを実行します。 ASP.NETコアプロジェクトをスタートアッププロジェクトとして設定している場合は、これらのコマンドに-StartupProjectName EF6を追加します。 Startup.csの 、appsettings.jsonにDIのコンテキストを登録し、接続文字列を追加します。

詳細情報については問題は6つの移行は新しいcsproj形式で動作するように慣れていないEFある

https://docs.microsoft.com/en-us/aspnet/core/data/entity-framework-6

0

ご覧ください。

thisプロジェクトの助けになったのは何ですか。

メインページの手順を確認してください。

一般に、指示された方法でプロジェクトにパッケージを追加するだけで、移行は正常に動作するはずです。