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の内容を日記にまとめておこうかな〜。