2016-07-18 19 views
19

.NET 4.6.2バージョンに基づいてライブラリを作成しました。
ライブラリに、EntityFrameworkバージョン6.1.3パッケージを追加しました。Enable-Migrations "2"引数で "SetData"を呼び出す例外


私は

using System; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

namespace Components.Models 
{ 
    public class Session 
    { 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string Id { get; set; } 

    [Key] 
    [Required] 
    public string Identity { get; set; } 

    [Required] 
    public DateTime CreatedAt { get; set; } 

    [Required] 
    public DateTime UpdatedAt { get; set; } 
    } 
} 

そしてdbcontextに従うように私は、マイグレーションを有効にしようとした後

using System.Configuration; 
using System.Data.Entity; 
using System.Data.Entity.ModelConfiguration.Conventions; 
using Components.Models; 

namespace Components.DataContexts 
{ 
    public class SessionContext : DbContext 
    { 
    public SessionContext() : base(ConfigurationManager.ConnectionStrings["sessiondb"].ConnectionString) 
    { 
    } 

    public DbSet<Session> Sessions { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>(); 
    } 

    } 
} 

モデルを作成し、

PM> Enable-Migrations 

声明を経由していた、エラーメッセージが表示されました

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 D:\C#\IndustryCloud\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.GetProjectTypes(Project project, Int32 shellVersion) 
    at System.Data.Entity.Migrations.Extensions.ProjectExtensions.IsWebProject(Project project) 
    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. 

何が間違っていますか?ここで

更新 構造、挙がどのようにsessiontest.csで

enter image description here

を構築し、私は、DBのためのテストを書きました。私はユニットテストを書いた

[Test] 
public void InsertARow_DbInitial_ExpectDbValue() 
{ 

    var sn = new Session() 
    { 
    Identity = Random.Generate(15), 
    CreatedAt = DateTime.Now, 
    UpdatedAt = DateTime.Now 
    }; 

    db.Sessions.Add(sn); 
    db.SaveChanges(); 

} 

ComponentsTestプロジェクトは、app.configをでは以下のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <connectionStrings> 
    <add connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Session;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" name="sessiondb" /> 
    </connectionStrings> 
</configuration> 

とライブラリ(コンポーネント)自体の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" /> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 

    <connectionStrings> 
    <add connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Session;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" name="sessiondb" /> 
    </connectionStrings> 

</configuration> 
+0

スタートアッププロジェクトに問題がある可能性がありますか? re [Enable-Migrations installation error](http://stackoverflow.com/questions/17308170/enable-migrations-installation-error) – Tone

+0

投稿を更新しました。確認してください。スタートアッププロジェクトで何が間違っているのでしょうか? –

+0

接続文字列を正しく定義していますか? –

答えて

21

他の回答は、これはスタートアッププロジェクトの問題であることを示唆しています。

プロジェクトがライブラリであるため、ユニットテストプロジェクトをスタートアッププロジェクトとしてthis answerに設定してみてください。

また、受け入れられた回答hereに従って、パッケージマネージャコンソールのデフォルトプロジェクトをライブラリプロジェクトに設定することもできます。

マイグレーションの作成場所に関する問題が発生する可能性があります。さらに制御する必要がある場合は、EF6にEnable-Migrationsで使用できるさまざまな引数があります(詳細はthis answerを参照してください)。読書をする必要があるかもしれません。

+3

Juhuiそれは動作します。コンポーネントをスタートアッププロジェクトとして設定します。本当にありがとう。 –

10

が明示的にスタートアッププロジェクトの定義から自由であるためには、次のコマンドを使用することができます。

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components 

パラメータは次のとおりです。

-ProjectName

は、プロジェクトその足場の移行の設定を指定します。クラスが(configuration.cs)に追加されます。 省略すると、パッケージマネージャ コンソールで選択されているデフォルトプロジェクトが使用されます。

-StartUpProjectName

という名前の接続文字列に使用する設定ファイルを指定します。省略すると、指定したプロジェクトの設定ファイルが使用されます。 、コマンドの詳細を取得し実行するには

:私はまだasp.netコアRc2の上で実行するように構成された古いっぽいプロジェクトをクローン化した後

get-help enable-migrations -Full   
+1

いいえ、まだ同じエラー – Softlion

+0

@Softlionは成功しません。あなたはあなたが得るエラーを投稿できますか? –

+0

受け入れられた答えを使用してそれはうまく動作します – Softlion

1

このエラーは、今日の私に発生しました。 1.1をインストールしてすべての変数を変更した後、エラーは持続しました。

私の場合の解決策はリブートです。 Asp.net Core 1.1のインストールはまだ完了していません。

+0

私は、ASP.NET Coreとフル.NETのフレームワークでこの問題を抱えています。私はこのアップデートを行っていくつもりです。 – James

+0

@James - あなたはこれを修正することができましたか、私は同じ問題を抱えていますが、将来の道を見つけることができませんでした。 – Krishna

+0

私はそれにもっと多くの時間を費やしていない、これは生産のためのプロジェクトではなく、ちょうど私が変更を混乱させる。私はリリースされたVS2017で問題を再現しようとしましたが、もはやそれはまったく動作しません。 – James

0

編集:簡単な修正(上記のように)私は、私はまだエラーを得た間違ったStartupProjectNameを使用していた-StartupProjectName YourEF6ProjectNameHere

。私は以下のソリューションを使用していたとき、それはです:

マイ場しのぎ回避策は、EFの移行を必要としないプロジェクトをアンロードすることです:

  1. は、スタートアッププロジェクト(私の場合はASP.Netコアプロジェクトをアンロード)。プロジェクト名を右クリックし、Unload Projectを選択します。
  2. パッケージマネージャコンソールの実行に必要なマイグレーション・コマンド
  3. アンロードされたプロジェクトを右クリックし、Reload Project
  4. 同じプロジェクトを右クリックし、Set as StartUp Projectを選択を選択してください。

楽しいことではありません。

3

あなたはNugetパッケージの管理、プロジェクト/に行き、両方Microsoft.EntityFrameworkCore.SqlServerはEntityFrameworkの古いバージョンと一緒にインストールされているVisual Studioでの6.x

を言うならば、この現象が発生することができます...

テイクInstalledリストを見て、EntityFrameworkの複数のバージョンがインストールされている場合は、すべての古いバージョンをアンインストールし、最新のバージョンのみを残してください。

+0

ASP.NET CoreのVSプロジェクトテンプレートには、Microsoft.AntNetForeeworkCore.Designを含む 'Microsoft.AspNetCore.All'がインストールされていました。 EF6をインストールした後、同じエラーが発生しました。解決策は、パッケージの「すべて」バージョンを削除し、必要な他のパッケージを別々に再インストールすることでした。 – Maetis

関連する問題