EF Core使用遇到的问题

开个贴,专门记录使用EF Core遇到的问题,之后本身用.net写东西,操做数据库就使用EF Core了c#

EF Core速度问题

问题描述

我须要导入600多个csv文件,批量导入不会弄,网上也没查.net

使用了读取再存储的方法code

EF使用方法1,每一行存储一次(400条/s)

能够看下面的代码每一行存一次,这种方法的速度差很少是每秒400多条数据的样子ci

foreach (var csvName in 600个文件)
{
    foreach (var 每一行 in 全部行)
    {
        using (var context = new MyContext())
        {
            context.dGKs.Add(dGK);
            context.SaveChanges();
        }
    }
}

EF使用方法2,连接不释放 (40条/s)

我感受是using (var context = new MyContext())这个的问题,由于using括号内就是一次对数据库的连接和释放,因此我把代码改为下面这样了,结果大跌眼镜it

using (var context = new MyContext())
{
    foreach (var csvName in 600个文件)
    {
        foreach (var 每一行 in 全部行)
        {
            context.dGKs.Add(dGK);
            context.SaveChanges();
        }
    }
}

上面这样,我觉得只有一次的连接释放会快一点,没想到更慢了,方法1每秒400多条数据,方法2这样每秒只有几十条,真的慢class

EF使用方法3,屡次add,一次SaveChanges(400条/s,可是数据库操做异常慢)

通过方法2,我又想了,屡次add,而后一次SaveChanges,这样会不会快一点?代码又改为了下面这样foreach

using (var context = new MyContext())
{
    foreach (var csvName in 600个文件)
    {
        foreach (var 每一行 in 全部行)
        {
            context.dGKs.Add(dGK);
        }
        context.SaveChanges();
    }
}

这样的结果也很很差,首先半天没反应,有反应了数据库忽然出现几万条数据,这和方法1每秒400条/s的速度也差很少啊csv

缺点还有:方法

  1. 我手动操做数据库的时候,单单一个查询语句半天才有反应,不能使用这个方法3
  2. 若是文件很大,我全部的行都add到一块儿,若是是70万条数据呢,听说EF Core最大1000条数据,再大就很慢了

因此,根据以上两个缺点,方法3也不好劲

因此,我最后仍是改成了方法1

using内部千万不要使用try catch

问题描述,有一个字段是字符类型的,例如: "12.123","None"

我想判断这个字段是否是数字,不是数字的话直接改成"0",由于数据库里面的字段直接设定的Decimal类型

而后,我脑残的使用了try catch,仍是在using内部使用的,以下

using (var context = new MyContext())
{
    try{
        dgk.aaa = int.Prase(dgk.aaa).toString();
    }
    catch{
        dgk.aaa = "0";
    }
    context.dGKs.Add(dGK);
    context.SaveChanges();
}

速度真的是超级慢了,每秒才30多条数据,慢死,catch真的耗时间

因此我换成了正则,话说,我一直不会正则

using (var context = new MyContext())
{
    if (!Regex.IsMatch(dGK.aaa, @"^\d+\.\d+$"))
    {
        dGK.aaa = "0";
    }
    context.dGKs.Add(dGK);
    context.SaveChanges();
}

换了正则以后和方法1差很少了,每秒400多条

相关文章
相关标签/搜索