2017-02-08 29 views
1

まず、Entity Frameworkコードを使用するプロジェクトがあります。 LinQpadを使用してデータベースをシードしたいと思います。私はLinqPadと同じことをしようとすると、私はエラーを取得するLinQPadでの拡張メソッドの使用

context.Rule.AddOrUpdate(
     y => y.Id, 
     new Rule() { Id = Guid.Parse("b9b4fc65-fd0b-4f7f-aa27-3147c7665d27"), ... }, 
     new Rule() { Id = Guid.Parse("66d27186-8be4-4ce2-8a74-737576e7157b"), ... } 
    ); 

Rules.AddOrUpdate(
     y => y.Id, 
     new Rules() { Id = Guid.Parse("b9b4fc65-fd0b-4f7f-aa27-3147c7665d27"), ... }, 
     new Rules() { Id = Guid.Parse("66d27186-8be4-4ce2-8a74-737576e7157b"), ... } 
    ); 

私はAddOrUpdate()拡張メソッドを使用するエンティティフレームワークに移行操作中にデータベースをシードするには

私はこのエラーを取得する:

CS1929 'Table<Rules>' does not contain a definition for 'AddOrUpdate' and the best extension method overload 'DbSetMigrationsExtensions.AddOrUpdate<Rules>(IDbSet<Rules>, params Rules[])' requires a receiver of type 'IDbSet<Rules>' 

LinqPadは、この拡張メソッドが表示されないのはなぜ?私はすでにEntityFrameworkへのNugetのリファレンスを追加し、NugetパッケージのmanagetとLinqPadの名前空間インポートにすべての名前空間を追加しました。

私はこの

System.Data.Entity.Migrations.DbSetMigrationsExtensions.AddOrUpdate(
      Rules as System.Data.Entity.IDbSet<Rules>, 
      y => y.Id, 
      new Rules() { Id = Guid.Parse("b9b4fc65-fd0b-4f7f-aa27-3147c7665d27"), ... }, 
      new Rules() { Id = Guid.Parse("66d27186-8be4-4ce2-8a74-737576e7157b"), ... } 
      ); 

のように同じコードを書くことを試みたと私はこのエラーを取得する:

CS0039 Cannot convert type 'System.Data.Linq.Table<LINQPad.User.Rules>' to 'System.Data.Entity.IDbSet<LINQPad.User.Rules>' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion 

私のオブジェクトルールのタイプがあるので、だから私は、拡張メソッドが動作していないと思います正しくありません。 LinqPadは独自のオブジェクト型を使用しているため、変換できません。

+0

あなたの接続では、 '自分のアセンブリから型付きデータコンテキストを使用するのではなく、'自動的にデータ構造を構築する 'オプションを使用していますか? – sgmoore

答えて

1

まず、System.Data.Entity.MigrationsをLinqpadクエリの名前空間のインポートに追加する必要があります(F4キーを押します)。

次に、AddOrUpdateメソッドの署名によって欺かれています。最初のパラメーターはIDbSet<TEntity>ですが、そのパラメーターは拡張メソッドとして使用すると自動的に提供されます。 context.Rule.AddOrUpdateでは、それはcontext.Ruleです。

(単に学術目的のために)通常の静的メソッド呼び出しでそれを使用する場合、それは

DbSetMigrationsExtensions.AddOrUpdate(context.Rule, y => y.Id, rules); 

でなければなりません(rulesは、もちろん、ルールのコレクションです)。

ところで、EFがデフォルトでプライマリキーを使用していたので、context.Rule.AddOrUpdate(rules)を使用することもできます。