【问题标题】:Entity Framework Bulk Merge实体框架批量合并
【发布时间】:2014-09-23 21:34:52
【问题描述】:

我正在尝试使用实体框架来执行合并操作。我曾尝试使用检索记录然后在代码中执行逻辑的幼稚方法,但速度非常慢。

我还研究过使用 here 讨论的 Bulk Insert 库,但它只支持批量插入。

到目前为止,我的解决方法是创建一个存储过程,为我的表定义一个表值类型,使用反射动态生成输入数据表,然后执行存储过程。

当然,这意味着每次我的表定义更改时,我现在都必须进入并更改存储过程代码和表值类型。

有没有更好的方法来做到这一点?如果我可以从 Entity Framework 动态生成列定义,那已经很有帮助了。

编辑:我指的是 T-SQL 合并:http://msdn.microsoft.com/en-us/library/bb510625.aspx

【问题讨论】:

    标签: c# entity-framework-4


    【解决方案1】:

    更新

    抱歉,我错过了问题被标记为 EF4。这仅适用于 EF 更改其映射 API 的新版本。我把它留在这里是因为旧的 api 也可以做同样的事情,我可以在下班后找到这样做的代码

    免责声明:我是 EFUtilities 的作者

    EFUtilities https://github.com/MikaelEliasson/EntityFramework.Utilities 现在支持批量更新。开箱即用它不允许您执行合并部分。如果您有办法知道要插入哪些实体以及要更新哪些实体,您可以发出一个插入 https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-insert-entities 和一个更新 https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-update-entities

    如果您确实需要合并它可以帮助您构建表格。您可以通过此代码访问我在内部使用的元数据。

    using (var db = new Context())
    {
        var mapping = EfMappingFactory.GetMappingsForContext(db);
        var commentMapping = mapping.TypeMappings[typeof(Comment)];
    }
    

    typeMapping 包含我用于动态构建临时表以进行批量更新的所有信息。出于某种原因,我将该代码设为私有,但这是为表生成 sql 的方法。所有信息都在 typeMapping 上可用。

        private string BuildCreateTableCommand(string schema, string tempTableName, IEnumerable<ColumnMapping> properties)
        {
            var pkConstraint = string.Join(", ", properties.Where(p => p.IsPrimaryKey).Select(c => "[" + c.NameInDatabase + "]"));
            var columns = properties.Select(c => "[" + c.NameInDatabase + "] " + c.DataType);
            var pk = properties.Where(p => p.IsPrimaryKey).Any() ? string.Format(", PRIMARY KEY ({0})", pkConstraint) : "";
    
            var str = string.Format("CREATE TABLE {0}.[{1}]({2} {3})", schema, tempTableName, string.Join(", ", columns), pk);
    
            return str;
        }
    

    【讨论】:

      【解决方案2】:

      最佳解决方案可能取决于您所说的“合并操作”究竟是什么意思。

      如果您的意思是要插入集合(表、csv 文件或其他)A 中尚未出现在集合 B 中的实体,您可以

      1. 为您的实体定义合适的 GetHashCodeEquals 方法
      2. 一口气将B中的所有现有记录读入内存(假设它们适合内存),将它们放入HashSet h
      3. A读取所有实体,计算A\h,这应该很快,然后将A\h插入B,可能使用批量插入库。

      这里的关键是避免对A 中的每个元素进行数据库查找。

      【讨论】:

      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多