我有一个首先使用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<Rules>' does not contain a definition for 'AddOrUpdate' and the best extension method overload 'DbSetMigrationsExtensions.AddOrUpdate<Rules>(IDbSet<Rules>, params Rules[])' requires a receiver of type 'IDbSet<Rules>'
为什么LinqPad看不到这种扩展方法?有关信息,我已经添加了Nuget对EntityFramework的引用,并在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 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
所以我猜扩展方法不起作用,因为我的对象规则的类型不正确。看来LinqPad使用自己的对象类型,我无法转换它。
答案 0 :(得分:2)
对于初学者,您应该将System.Data.Entity.Migrations
添加到Linqpad查询的命名空间导入中(按F4)。
接下来,您被AddOrUpdate
方法的签名所迷惑。第一个参数是IDbSet<TEntity>
,但是当您将其用作扩展方法时,该参数会自动提供。在context.Rule.AddOrUpdate
中,它是context.Rule
。
在常规静态方法调用中使用它时(仅用于学术目的),它应该是
DbSetMigrationsExtensions.AddOrUpdate(context.Rule, y => y.Id, rules);
(当然,rules
是您的规则集合。
顺便说一下,您也可以使用context.Rule.AddOrUpdate(rules)
,因为EF默认使用主键。