![](/img/trans.png)
[英]What is the difference between using the Dump() extension method and using the Console.WriteLine() in the 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.