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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM