EF Core使用遇到的问题

开个贴,专门记录使用EF Core遇到的问题,以后自己用.net写东西,操作数据库就使用EF Core了

EF Core速度问题

问题描述

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

使用了读取再存储的方法

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

可以看下面的代码每一行存一次,这种方法的速度差不多是每秒400多条数据的样子

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括号内就是一次对数据库的链接和释放,所以我把代码改成下面这样了,结果大跌眼镜

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

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

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

经过方法2,我又想了,多次add,然后一次SaveChanges,这样会不会快一点?代码又改成了下面这样

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

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

缺点还有:

  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多条

posted @ 2019-09-24 23:35  蜀云泉  阅读(1533)  评论(2编辑  收藏  举报