EF中是否存在真正的T-SQL MERGE
语句等价物?我知道他们在以前的版本中添加了AddOrUpdate
,显然处理了添加或更新方面。它缺少从源匹配然后从目标表中删除的时间。
这个特殊的过程实际上只是同步第三方json结构批发。我没有在Entity Framework中的包装添加/更新/删除功能上找到任何内容。我想在这里或者有关于包装这个的任何创造性想法,而不是枚举实体,检查是否存在,以及删除密钥存在于DB中但不存在于源实体中的位置。
感谢。
答案 0 :(得分:2)
通过一系列第三方解决方案,我终于找到了一个完成完美工作的解决方案。 http://www.zzzprojects.com/entity-framework/library/bulk-merge
它速度极快,需要一个nuget安装,一个使用和一行代码。
context.BulkMerge(list);
(我还发现批量更新很有用。)
context.BulkUpdate(list);
这些功能包含实体列表。
我的完整语境如下:
public void Merge(MyDataBaseEntity[] array)
{
using (var ctx = new Entities())
{
var list = array.ToList();
ctx.BulkMerge(list);
}
}
答案 1 :(得分:1)
这有点奇怪,但您可以根据他们的ID没有包含在“源”实体的集合中来选择记录,然后从DbContext中删除它们。
var sourceIds = source.Select(s=>s.Id);
var notFounds = context.Target.Select(s=>!sourceIds.Contains(s.Id));
foreach (var notFound in notFounds) {
context.Target.DeleteObject(notFound);
}
不幸的是,没有批量删除。
答案 2 :(得分:0)
不是EF本身。
这个(https://gist.github.com/ondravondra/4001192)创建了一个sql merge语句。它不包含删除但它是开放的,应该很容易添加WHEN NOT MATCHED BY SOURCE THEN DELETE
或其他东西。
免责声明:我根本没有与该代码相关联,只是发现了它
或者,您也可以使用存储过程