首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高列表访问速度,将更多数据保存到数据库中

提高列表访问速度,将更多数据保存到数据库中
EN

Stack Overflow用户
提问于 2020-02-27 22:04:13
回答 1查看 45关注 0票数 0

我正在构建一段代码,使用Entity Framework5.0将更多数据保存到SQL数据库中

我正在构建以下代码:

代码语言:javascript
复制
                foreach (EcgDTO.HrvData data in u.hrvData)
                {
                    if (data.hrv != null && data.hrv.Count > 0)
                    {

                        foreach (String d in data.hrv)
                        {
                            ECG ecg = new ECG();
                            ecg.Id = id++;
                            ecg.IdPerson = idPatient;
                            ecg.y = Decimal.Parse(d);
                            ecg.timestamp = data.createdDate;
                            dbData.ECG.Add(ecg);
                        }

                    }
                }
                int savedData = dbData.SaveChanges();

这是ECG类

代码语言:javascript
复制
 [DataContract]
    public class EcgDTO
    {

        [DataMember(Name = "hrvData")]
        public List<HrvData> hrvData { get; set; }



        public class HrvData
        {
            [DataMember(Name = "patientId")]
            public String patientId { get; set; }
            [DataMember(Name = "hrv")]
            public List<String> hrv { get; set; }
            [DataMember(Name = "createdDate")]
            public DateTime createdDate { get; set; }
            [DataMember(Name = "createdBy")]
            public String createdBy { get; set; }
            [DataMember(Name = "modifiedBy")]
            public String modifiedBy { get; set; }

            [DataMember(Name = "modifiedDate")]
            public DateTime modifiedDate { get; set; }


        }
    }

现在我的输入列表可以有227个项目,HRV列表有67个值

有没有办法提高滚动两个列表和保存到数据库的速度?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-28 06:12:37

在插入大量行时,一个性能因素是DbContext及其跟踪缓存。DbContext跟踪的实体越多,提交更改并尝试审查和更新所有关联所需的时间就越长。对于可变的大集合(10个数千或更多),您应该将集合划分为更易于管理的块。在您的情况下,这可能不是必需的,但我会检查您的DbContext是否尽可能短暂,以避免在执行此操作时处理所有其他被跟踪的实体。首先:

代码语言:javascript
复制
using(var insertContext = new MyAppContext())
{
    foreach (EcgDTO.HrvData data in u.hrvData)
    {
        if (data.hrv == null && data.hrv.Count == 0)
            continue;

        foreach (String d in data.hrv)
        {
            ECG ecg = new ECG
            {
                Id = id++;
                IdPerson = idPatient;
                y = Decimal.Parse(d);
                timestamp = data.createdDate;
            };
            insertContext.ECG.Add(ecg);
        }
    }
    int savedData = insertContext.SaveChanges();
}

您可以使用Linq构建ECG实体,但我认为这并不容易理解。这里的关键建议不是使用主DbContext,而是使用范围仅限于此操作的专用DbContext实例执行插入。

Id = id++;这样的逻辑有点令人担忧,因为这将只需要此操作的一个实例在任何特定的时间点运行。理想情况下,新行的ID分配应该在DB级别使用标识列或序列/生成方法进行处理,其中EF被配置为将它们视为标识列。这样,您就不必担心多个实例试图插入相同的ID范围。例如,如果id设置为类似SELECT MAX(Id) From ECG的值,如果两个实例几乎同时启动此操作,则这两个实例将从数据库中获得相同的MAX(Id)值,并尝试插入相同的递增ID。首先保存的那个将成功,而第二个将引发关于重复PKs的异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60435036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档