繁体   English   中英

实体框架中的True合并语句

[英]True merge statement in Entity Framework

EF中有T-SQL MERGE语句的真正等效项吗? 我知道他们在以前的版本中添加了AddOrUpdate ,该版本显然处理了添加或更新方面。 缺少从源中不匹配然后从目标表中删除时的内容。

从字面上看,此特定过程只是同步批发了第三方json结构。 我在实体框架的包装的添加/更新/删除函数中未找到任何内容。 我想问一下我的问题,或者是关于包装此对象,枚举实体,检查是否存在以及删除键在数据库中而不在源实体中存在的位置的任何创造性的想法。

谢谢。

有点奇怪,但是您可以根据记录的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);
}

不幸的是,没有批量删除。

为此,经过一系列的第三方解决方案浇注之后,我终于找到了一个做得很好的解决方案。 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);
     }
}

并非EF本身。

有这个( https://gist.github.com/ondravondra/4001192 )创建一个sql合并语句。 它不包括删除,但它是开放式的,应该很容易添加“ WHEN NOT MATCHED BY SOURCE THEN DELETE

免责声明 :我根本没有与该代码关联,只是在周围找到了它

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM