实体框架中的真实合并声明

时间:2015-08-28 18:38:47

标签: c# entity-framework-6

EF中是否存在真正的T-SQL MERGE语句等价物?我知道他们在以前的版本中添加了AddOrUpdate,显然处理了添加或更新方面。它缺少从源匹配然后从目标表中删除的时间。

这个特殊的过程实际上只是同步第三方json结构批发。我没有在Entity Framework中的包装添加/更新/删除功能上找到任何内容。我想在这里或者有关于包装这个的任何创造性想法,而不是枚举实体,检查是否存在,以及删除密钥存在于DB中但不存在于源实体中的位置。

感谢。

3 个答案:

答案 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或其他东西。

免责声明:我根本没有与该代码相关联,只是发现了它

或者,您也可以使用存储过程