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

相關文章
相關標籤/搜索