Entity Frameworkでもバルク更新したいよね(・∀・)
ORMも、Entityした方向に向かうとバルク更新とかを軽視しがちで(´д`;)
あげくの果ては、そういう用途にORMを使うなとか、そこだけ別の仕組みを使えとか、ORMを作っている人自らがそんな事を言い出したりもしますが(・∀・#)
でも、やっぱりORMの他の機能と違和感無い形でのバルク更新もしたいよね、っと思うのが人情というもの(・ω・)
自分もLINQ to SQLの時はこんな風に拡張メソッドを使って対処していたわけですが。
当然、Entity Frameworkでも同様の事はやりたくなるわけで。
UserVoiceのEFに対するFeature SuggestionsでもBatch CUD supportの要望は2位だしね〜(・ω・)
っと思っていたら、EntityFramework.Extendedなるものがあるそうで(・∀・)
EntityFramework.Extended
http://weblogs.asp.net/pwelter34/archive/2011/11/29/entity-framework-batch-update-and-future-queries.aspx
NuGetからもインスコできるので、実際に試してみました。
試してみる
更新と削除を以下の様な感じで(・ω・)
// 更新 context.Employee.Update(t => t.Id == 4054, t => new Employee { Name = "うさ☆うさ" }); // 削除 context.Employee.Delete(t => t.Department.Name == "デ部");
ちなみに、SQLを覗いてみるとこんな感じのものが生成されていて。
UPDATE [Employee] SET Name = @p__update__0 FROM [Employee] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Employee] AS [Extent1] WHERE 4054 = [Extent1].[Id] ) AS j1 ON (j0.Id = j1.Id)
DELETE [Employee] FROM [Employee] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Employee] AS [Extent1] INNER JOIN [dbo].[Department] AS [Extent2] ON [Extent1].[DepartmentId] = [Extent2].[Id] WHERE N'デ部' = [Extent2].[Name] ) AS j1 ON (j0.Id = j1.Id)
ちゃんとバルク更新を確認できたのでしたヽ(・∀・)ノ
EntityFramework.Extendedのソース
EntityFramework.Extendedのソースは下記にあって。
https://github.com/loresoft/EntityFramework.Extended
バッチ更新は、EntityFramework.Extended/Extensions/BatchExtensions.csのあたりの処理がそれ。
DynamicQueryableを使ったりしながらSQLを加工し、ExecuteNonQuery()で処理実行、っという流れ(・ω・)
っというわけで、EntityFramework.ExtendedがあればEntity Frameworkを使うときの痛みも減るかも(・∀・)?
…っといいつつ、結局Micro ORMを使っているかもしれないけどね(・∀・;)
Micro ORMに関する考えも、Twitterの内容を日記にまとめておこうかな〜。