2017-02-08 10 views
1

У меня есть проект, который использует сначала код Entity Framework. Я хотел бы использовать LinQpad для загрузки моей базы данных.Использование метода расширения с LinQPad

Чтобы заполнить базу данных во время операции миграции с Entity Framework Я использую AddOrUpdate() метод расширения:

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"), ... } 
    ); 

Когда я пытаюсь сделать то же самое с LINQPad я получаю сообщение об ошибке:

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"), ... } 
    ); 

Я получаю эту ошибку:

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 не видят этот метод расширения? Для информации я уже добавил ссылку Nuget на EntityFramework и добавил все пространство имен в пакет управления пакетами Nuget и имён 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, конечно, ваша коллекция правил).

Кстати, вы также можете использовать context.Rule.AddOrUpdate(rules), потому что EF по умолчанию использовал первичный ключ.