C#bulkinsert MSSQL对象引用未设置为对象的实例的怪异问题

时间:2019-02-18 23:31:37

标签: c# ef-bulkinsert

我一直想解决一个奇怪的问题。

BulkInsert在一个数据库中工作,但即使在相同的表中也不能在另一个数据库中工作。 Visual Studio 2017,c#。我使用反向poco构建实体框架文件。

每个数据库中的SQL表仅包含以下内容:

CREATE TABLE [dbo].[BulkInsertTest](
  [id] [int] NOT NULL,
  [name] [varchar](50) NOT NULL,
CONSTRAINT [PK_BulkInsertTest] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

C#代码很简单:

using (GISDbContext db = new GISDbContext())
{
  List<BulkInsertTest> sqlFormattedRecords = new List<BulkInsertTest>();
    for (int i = 20; i < 40; i++)
    {
        BulkInsertTest record = new BulkInsertTest();
        record.Id = i;
        record.Name = $"NameIs{i}";
        sqlFormattedRecords.Add(record);
     }

     // Insert the newly loaded records into the  table
     using (var transactionScope = new TransactionScope())
     {
         db.BulkInsert(sqlFormattedRecords);
         db.SaveChanges();
         transactionScope.Complete();
     }
}

当我将相同的代码指向一个数据库时,它就起作用了。当我将其指向另一个数据库时,它没有。它在bulkinsert函数中失败,并出现空指针异常:

at EntityFramework.BulkInsert.ProviderFactory.Get(DbContext context)

因此,我然后尝试重新创建第二个数据库以使用第一个数据库的连接字符串。第二组反向poco tt文件实际上是第一个数据库tt文件的副本,其上下文名称已更改为GISDbContext。

您会认为这可行。没有。同样的错误。

但是仍然可以将代码切换回使用第一个反向poco dbcontext。

所以它不是连接字符串。不是反向poco .tt文件。不是数据库或表。但是我不确定是什么原因引起的。

编辑:所以目前我删除了第二个(无效的)反向poco tt文件,并尝试更新第一个反向poco tt文件,以查看崩溃的位置。一切正常,直到我尝试更改DbContextName。当我这样做时,它就坏了。不管我将其更改为什么,如果它不是我用于工作tt文件的原始上下文名称,它就会崩溃。

这对我来说绝对没有意义。

我尝试清洁溶液(该解决方案中的一个项目)。我尝试在清洁解决方案后清除obj / bin文件夹。没有效果。太疯狂了。

1 个答案:

答案 0 :(得分:0)

这有点重复。我简化了代码以缩小范围,然后再次发布,因为我认为人们不会对此感到困扰。

原来,该解决方案使dbcontext名称与连接字符串名称相同。谢谢你Fakhar。