【问题标题】:c# bulkinsert MSSQL Object reference not set to an instance of an object weird issuec# bulkinsert MSSQL Object reference not set to an instance of an object奇怪的问题
【发布时间】:2019-02-18 23:31:37
【问题描述】:

我一直在尝试解决一个奇怪的问题。

BulkInsert 在一个数据库中有效,但在另一个数据库中无效,即使是相同的表。 Visual Studio 2017,c#。我已经使用反向 poco 来构建实体框架文件。

每个 db 中的 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 文件实际上是第一个 db 的 tt 文件的副本,其上下文名称更改为 GISDbContext。

你会认为这行得通。它没有。同样的错误。

将代码切换回使用第一个反向 poco dbcontext 仍然有效。

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

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

这对我来说完全没有意义。

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

【问题讨论】:

  • 奇怪的情况。我在试图弄清楚这一点方面已经走得更远了。我将两个反向 poco 文件设置为相同的数据库上下文,它仍然会发生。一种有效,一种无效。然后我尝试将顶部的一个切换到另一个数据库连接字符串名称,这很有效。因此,我将顶部更改为使用第二个数据库的信息,当我更改 DBContextName 时它会崩溃。一切都一样,但 dbcontextname 更改会导致它遇到异常!即使我删除 bin/obj 文件夹并清理解决方案,我也无法将其设置为原始值之外的任何值。

标签: c# ef-bulkinsert


【解决方案1】:

这有点重复。我简化了代码以缩小发生的范围,然后再次发布,因为我认为人们不会为这个问题而烦恼。

解决方案原来是使 dbcontext 名称与连接字符串名称相同。谢谢法哈尔。

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2012-01-02
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多