【问题标题】:SQLBulk Copy With Related Entities (Entity Framework)具有相关实体的 SQL 大容量复制(实体框架)
【发布时间】:2013-03-21 19:35:58
【问题描述】:

假设我有以下实体。 (为简洁起见进行了大幅简化,但包含了关键属性)

public  class Crime 
{

       [Key]
       public int CrimeId {get;set;}
       public virtual ICollection<Victim> Victims {get;set;}
       public virtual CrimeDetail Detail {get;set}

}

public class Victim
{
       [Key]
       public int VictimId {get;set;}
       public string VictimCategory {get;set;}
}

public class CrimeDetail
{
       [Key]
       public int id {get;set;}
       public string DetailText {get;set;}
}

我有 600,000+ 条记录要插入到 SQL Server 2008 Express R2 中,使用 Entity Framework 4.4 需要相当长的时间。

理想情况下,我想使用SQLBulkCopy 批量插入这些记录,但由于它不支持复杂类型(至少不是开箱即用的),所以我正在尝试寻找其他一些潜在的解决方案。

如有必要,我愿意更改我的模型。

编辑:AsDataReader Extension method from MSDN 在这种情况下会有帮助吗?

【问题讨论】:

    标签: c# .net sql-server-2008 entity-framework sqlbulkcopy


    【解决方案1】:

    当遇到同样的问题时,我们最终会使用 EF 生成代码优先的数据库和用于 SQLBulkCopy 的强类型生成数据集。

    (我们从未真正编码过这些类,它们是使用 xsd 实用程序从 1-10gb xml 文件的 xsd 定义中生成的。我现在正试图回想当我们没有从同一个 xsd 生成类型化数据集时,但这似乎无关紧要你的问题。)

    根据您获取这 600k+ 条记录的方式,您可以更改代码以使用生成的强类型数据集,或者使用一些对象到对象映射器将您的 EF POCO 对象映射到数据集,因为属性将被命名为相同.

    这是关于生成强类型数据集的link

    这里是example 如何使用SqlBulkInsert。

    【讨论】:

    • 你能稍微扩展一下吗?
    • 记录来自另一个数据库,然后映射到我们的 Code First 生成的实体。感谢您的提示,我会让您知道我的进展情况。
    • 如果你的另一个数据库也在sqlserver中,那么在sql中做映射是有意义的。
    • 遗憾的是,他们不是。记录来自 Oracle,我们在将记录保存到我们的数据库之前对其进行额外处理
    • 如果需要定期发送大约一百万条记录并且性能存在问题,也许您应该将 oracle 服务器链接到 sql server,将所有数据拉取到类似于您的 oracle 的 sql 架构中,然后已经在 sql server 中进行处理。您将能够使用 sql server 代理作业将其自动化。
    猜你喜欢
    • 2021-12-04
    • 2021-05-03
    • 1970-01-01
    • 2020-04-11
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多