Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Loop语句从CVS文件插入数据库_C#_Asp.net Core Mvc_Entity Framework Core_Asp.net Core 2.2_Csvhelper - Fatal编程技术网

C# 如何使用Loop语句从CVS文件插入数据库

C# 如何使用Loop语句从CVS文件插入数据库,c#,asp.net-core-mvc,entity-framework-core,asp.net-core-2.2,csvhelper,C#,Asp.net Core Mvc,Entity Framework Core,Asp.net Core 2.2,Csvhelper,我的代码有问题。我插入到我的数据库使用上传的逗号删除(CSV)文件,其中有5行。第一行成功插入数据库,但在插入第二行的第二个循环中,我遇到错误: 当identity_insert设置为OFF时,无法在表“bdoToDbs”中为identity列插入显式值 这是我的循环码 while (i < users.Count) { ViewBag.CompanyCode = users[i].CompanyCode;

我的代码有问题。我插入到我的数据库使用上传的逗号删除(CSV)文件,其中有5行。第一行成功插入数据库,但在插入第二行的第二个循环中,我遇到错误:

当identity_insert设置为OFF时,无法在表“bdoToDbs”中为identity列插入显式值

这是我的循环码

            while (i < users.Count)
            {
                ViewBag.CompanyCode = users[i].CompanyCode;
                ViewBag.ProductCode = users[i].ProductCode;
                ViewBag.TransactionDate = users[i].TransactionDate;
                ViewBag.TransactionTime = users[i].TransactionTime;
                ViewBag.OriginatingBranch = users[i].OriginatingBranch;
                ViewBag.CustomerNumber = users[i].CustomerNumber;
                ViewBag.TransactionOrigin = users[i].TransactionOrigin;
                ViewBag.TypeOfPayment = users[i].TypeOfPayment;
                ViewBag.CheckNumber = users[i].CheckNumber;
                ViewBag.TransactionAmount = users[i].TransactionAmount;
                ViewBag.CustomerName = users[i].CustomerName;

                bdoToDb.CompanyCode = ViewBag.CompanyCode;
                bdoToDb.ProductCode = ViewBag.ProductCode;
                bdoToDb.TransactionDate = ViewBag.TransactionDate;
                bdoToDb.TransactionTime = ViewBag.TransactionTime;
                bdoToDb.OriginatingBranch = ViewBag.OriginatingBranch;
                bdoToDb.CustomerNumber = ViewBag.CustomerNumber;
                bdoToDb.TransactionOrigin = ViewBag.TransactionOrigin;
                bdoToDb.TypeOfPayment = ViewBag.TypeOfPayment;
                bdoToDb.CheckNumber = ViewBag.CheckNumber;
                bdoToDb.TransactionAmount = ViewBag.TransactionAmount;
                bdoToDb.CustomerName = ViewBag.CustomerName;
                bdoToDb.UserName = ViewBag.DisplayName;
                bdoToDb.UserIP = HttpContext.Connection.RemoteIpAddress.ToString();
                bdoToDb.UserDate = DateTime.Now.ToString("MM/dd/yyyy");
                i++;
                _context.Add(bdoToDb);
                await _context.SaveChangesAsync();
            });
            return RedirectToAction(nameof(Index));
        }
while(i
EF core的一个优点是它跟踪更改,然后您可以通过保存一次提交所有更改。如果你移动

       await _context.SaveChangesAsync();
在while循环之外(编辑:并根据下面的精明注释在每次迭代中构造一个新对象),它将起作用。对于标识插入表,您不设置对象的ID,但为了能够知道该ID最终是什么,在调用save changes后,它会更新对象的ID字段。因此,在第一次保存后,ID字段被设置为下一个ID是什么,然后更新对象上的所有属性,然后使用.Add。因此它尝试插入该ID,但该ID已被设置并标记为已修改。您还可以通过每次构造一个新的对象实例来解决这个问题,或者EF有办法清除该ID并将其标记为未修改。。。但我建议将您的存储移到最后,因为这样可能会更有效率。如果这是针对非常大的数据量,也许每次通过1000条左右的记录时都会保存,但除非数据很大,否则就不用担心了

对于后续的查询,大致如下:(您实际上只需要对象的不同实例,因为EF将这些实例存储在内存中)

ViewBag.TransactionMount=用户[i].TransactionMount;
ViewBag.CustomerName=用户[i].CustomerName;
//新增构造函数

bdoToDb=新的bdoToDb();//顺便说一句,为什么要使用ViewBag?我有一个获取用户active directory详细信息的界面,我把它放在ViewBag中。但是这些值在循环中被覆盖了,所以如果我这样做,它只是ViewBag中的最后一行,它只会将CSV的最后一行保存到数据库中,而不是所有的行。@josebalerosjr主要问题是每次迭代都要重用bdoToDb实例。@josebalerosjr这是EF。只要上下文是活动的,每个实体都必须有自己的对象。为每个插入创建一个新的bdoToDb对象。这一点很好,@josebalerosjr。我猜你无论如何都需要构造一个新对象。@victorhomaswilcoxjr。非常感谢。我的代码正在运行。。我添加
bdoToDb=newbdotodb()到我以前的代码,它工作得非常好。谢谢。
            ViewBag.TransactionAmount = users[i].TransactionAmount;
            ViewBag.CustomerName = users[i].CustomerName;

            // added constructor
            bdoToDb = new BdoToDb(); // <- don't know name of your class

            bdoToDb.CompanyCode = ViewBag.CompanyCode;
            bdoToDb.ProductCode = ViewBag.ProductCode;