使用LinQPad的扩展方法

时间:2017-02-08 03:37:16

标签: c# entity-framework linqpad

我有一个首先使用Entity Framework代码的项目。我想使用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使用自己的对象类型,我无法转换它。

1 个答案:

答案 0 :(得分:2)

对于初学者,您应该将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默认使用主键。