通过实体框架节省花费太多时间

时间:2014-02-04 10:02:43

标签: c# .net entity-framework entity-framework-6

我使用Entity Frameworks 6.0.2将Observable集合中的记录保存到表中是代码

   foreach(var item in obcollection)
   { 
       cid=InsertClaimsInfoes;
   }


    private long InsertClaimsInfoes()
    {
            using (OptimusEntities opt = new OptimusEntities())
            {
                var x = cc.Provider.Split(',')[1];
                var patf = cc.PatientName.Split(',')[1];
                var patl = cc.PatientName.Split(',')[0];
                var z = opt.Providers.Where(i => i.ProviderFirstName.ToLower().Trim() == x.ToLower().Trim()).FirstOrDefault().Id;


                ClaimsInfo _claimInfo = new ClaimsInfo();
                {
                    _claimInfo.Id = Convert.ToInt64(opt.ClaimsInfoes.Max(i => i.Id) + 1);
                    _claimInfo.BatchID = 1;
                    _claimInfo.ClientID = 122;
                    _claimInfo.PayorID = 0;

                    _claimInfo.ReceiverProviderId = opt.Providers.Where(i => 
                i.ProviderFirstName.ToLower().Trim() == x.ToLower().Trim()).FirstOrDefault().Id;

                    _claimInfo.ServiceProviderId = _claimInfo.ReceiverProviderId;
                    _claimInfo.SubscriberId = _claimInfo.ReceiverProviderId;

                    _claimInfo.PatientId = opt.Patients.Any(i => i.FirstName.ToLower().Trim() == patf.ToLower().Trim()) ? opt.Patients.Where(j => 
                j.FirstName.ToLower().Trim() == patf.ToLower().Trim()).FirstOrDefault().Id : InsertPatient(patf, patl, cc.DOB, 122, cc.Insurance);

                    _claimInfo.InsuranceName = cc.CarrierName;
                    _claimInfo.SelfClaim = true;
                    _claimInfo.DOSFrom = Convert.ToDateTime(cc.DOS);
                    _claimInfo.DOSTo = Convert.ToDateTime(cc.DOE);
                    _claimInfo.BillingDate = Convert.ToDateTime(cc.DOE);
                    _claimInfo.ClaimNum = cc.Insurance;
                    _claimInfo.SubmitAmount = Convert.ToDecimal(cc.BillValue);
                }
                //opt.Configuration.ProxyCreationEnabled = false;
                opt.ClaimsInfoes.Add(_claimInfo);

                opt.SaveChanges();

                return _claimInfo.Id;

        }

    }

保存记录需要4-5秒。 ObservableCollection的大小超过1000.需要30分钟的aprox才能保存所有的Observable Collection。我在这里做错了多少时间。我能做些什么来改善表现。

1 个答案:

答案 0 :(得分:3)

您正在创建与数据库每条记录的新连接,并单独保存每条记录。 SaveChanges本质上是事务性的,将您的for循环置于上下文中并对SaveChanges进行一次调用,即

using (OptimusEntities opt = new OptimusEntities())
{
    foreach(var item in obcollection)
    {
        ...
    }
    opt.SaveChanges();
}

此外,您在执行插入操作之前似乎正在进行各种查询,这会导致每个请求1次访问数据库。如果您计划进行批量插入,我建议使用SqlBulkCopy类,因为它是far more efficient

相关问题