繁体   English   中英

在 LinQPad 中使用扩展方法

[英]Using extension method with LinQPad

我有一个使用实体框架的项目,代码优先。 我想使用 LINQPad 为我的数据库做种。

要在使用实体框架的迁移操作期间为数据库做种,我使用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“表”不包含“AddOrUpdate”的定义,最佳扩展方法重载“DbSetMigrationsExtensions.AddOrUpdate(IDbSet, params Rules[])”需要“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 无法通过引用转换、装箱转换、拆箱转换、包装转换将类型“System.Data.Linq.Table<LINQPad.User.Rules>”转换为“System.Data.Entity.IDbSet<LINQPad.User.Rules>” , 或 null 类型转换

所以我猜扩展方法不起作用,因为我的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 默认使用主键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM