在 LinQPad 中使用扩展方法

Using extension method with 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' does not contain a definition for 'AddOrUpdate' and the best extension method overload 'DbSetMigrationsExtensions.AddOrUpdate(IDbSet, params Rules[])' requires a receiver of type 'IDbSet'

为什么 LINQPad 看不到这个扩展方法?我已经添加了对 EntityFramework 的 NuGet 引用,并在 LINQPad 的 NuGet 包管理器和命名空间导入中添加了所有命名空间。

我试过像这样写同样的代码:

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

所以我猜扩展方法不起作用,因为我的 Rules 对象的类型不正确。 LINQPad 似乎使用了它自己的对象类型,我无法转换它。

对于初学者,您应该将 System.Data.Entity.Migrations 添加到 LINQPad 查询的命名空间导入(按 F4)。

接下来,您被 AddOrUpdate 方法的签名所迷惑。第一个参数是 IDbSet<TEntity>,但当您将其用作扩展方法时会自动提供该参数。在 context.Rule.AddOrUpdate 中,它是 context.Rule

如果您没有 IDbSet<TEntity>,那么您可能没有连接到 EF6 DbContext。

在常规静态方法调用中使用时(仅供学术使用),应该是

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

(其中rules,当然是你的规则集)。

顺便说一下,您也可以使用 context.Rule.AddOrUpdate(rules) 因为 EF 默认使用主键。