asp.net 为什么会出现异常SqlException IDENTITY_INSERT设置为OFF

mwkjh3gx  于 2022-12-15  发布在  .NET
关注(0)|答案(2)|浏览(134)
HeuteDb heute = new HeuteDb();
string filePath = @"C:\Users\Elias\Desktop\ASPlearning\DATA\Data.csv";

using (StreamReader reader = new StreamReader(filePath))
{
    string line;

    while ((line = reader.ReadLine()) != null)
    {
        List<string> items = line.Split(';').ToList();

        heute.Uhrzeit = items[0];
        heute.Energie = items[1];

        _context.HeutesDb.Add(heute);
        _context.SaveChanges();
    }
}

我有一个CSV文件,我想将其存储到我的数据库中。其中有一个被设置为主键的ID以及UhrzeitEnergie值。
在CSV文件的每一行之后,我将更改保存到数据库中。它只保存数据库中的第一行,然后抛出一个错误。
将CSV文件保存到数据库中的最佳方法是什么?

flseospp

flseospp1#

看看你的圈

while ((line = reader.ReadLine()) != null)
{
    List<string> items = line.Split(';').ToList();

    heute.Uhrzeit = items[0];
    heute.Energie = items[1];

    _context.HeutesDb.Add(heute);
    _context.SaveChanges();
}

您一次又一次地向数据库中添加相同的示例 heute,但示例是相同的,因此在第一次成功插入之后,EF会自动将属性ID(假定包含IDENTITY值)设置为执行第一次插入时获得的值。
在下一个循环中,再次传递同一示例(仍具有上一个循环中设置的ID属性)以进行添加,但此时引擎拒绝插入,因为除非为表调用 SET IDENTITY_INSERT 'tablename' ON,否则不应设置ID值。
只需在循环中移动 heute 变量的初始化就可以解决这个问题。

while ((line = reader.ReadLine()) != null)
{
    
    List<string> items = line.Split(';').ToList();

    HeuteDb heute = new HeuteDb();
    heute.Uhrzeit = items[0];
    heute.Energie = items[1];

    _context.HeutesDb.Add(heute);
    _context.SaveChanges();
}


现在,在每个循环中,heute 示例及其ID属性都是新的,没有前一个循环的任何剩余内容,并且数据库引擎将插入您的记录。

bn31dyow

bn31dyow2#

您可能需要在数据库中设置Identity列的自动增量(值自动增加1),或者需要在插入时指定Identity列的值,
第一个条目保存成功,因为int数据类型的默认值为0,由于0不作为条目存在,因此允许保存(下一个记录需要不同的ID)

相关问题