我正在构建一段代码,使用Entity Framework5.0将更多数据保存到SQL数据库中
我正在构建以下代码:
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类
[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个值
有没有办法提高滚动两个列表和保存到数据库的速度?
发布于 2020-02-28 06:12:37
在插入大量行时,一个性能因素是DbContext及其跟踪缓存。DbContext跟踪的实体越多,提交更改并尝试审查和更新所有关联所需的时间就越长。对于可变的大集合(10个数千或更多),您应该将集合划分为更易于管理的块。在您的情况下,这可能不是必需的,但我会检查您的DbContext是否尽可能短暂,以避免在执行此操作时处理所有其他被跟踪的实体。首先:
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的异常。
https://stackoverflow.com/questions/60435036
复制相似问题