【问题标题】:Using extension method with LinQPad使用 LinQPad 的扩展方法
【发布时间】:2017-02-08 03:37:15
【问题描述】:

我有一个使用实体框架的项目,代码优先。我想使用 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“表”不包含“AddOrUpdate”的定义,并且最佳扩展方法重载“DbSetMigrationsExtensions.AddOrUpdate(IDbSet, params Rules[])”需要“IDbSet”类型的接收器

为什么 LINQPad 看不到这个扩展方法?我已经添加了对 EntityFramework 的 NuGet 引用,并在 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 无法通过引用转换、装箱转换、拆箱转换将类型“System.Data.Linq.Table”转换为“System.Data.Entity.IDbSet” , wrapping 转换, 或者 null 类型转换

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

【问题讨论】:

  • 在您的连接中,您使用的是Build data context automatically 选项而不是Use a typed data context from your own assembly 吗?

标签: c# entity-framework linqpad


【解决方案1】:

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

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

如果您没有IDbSet&lt;TEntity&gt;,那么您可能没有连接到 EF6 DbContext。

在常规静态方法调用中使用它时(仅出于学术目的),它应该是

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

(当然,rules 是您的规则集合)。

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

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多