在 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 默认使用主键。
我有一个项目使用 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 默认使用主键。