c# bulkinsert MSSQL Object reference not set to an instance of an object 奇怪的问题
c# bulkinsert MSSQL Object reference not set to an instance of an object weird issue
我有一个奇怪的问题,我一直在努力解决。
BulkInsert 在一个数据库中有效,但在另一个数据库中无效,即使 tables 相同。
Visual Studio 2017 年,C#。我使用反向 poco 来构建 entity framework 文件。
每个数据库中的 SQL table 仅包含:
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 文件。它不是数据库或 table。但是我不确定是什么问题引起的。
编辑:所以目前我删除了第二个(非工作)反向 poco tt 文件并尝试更新第一个文件以查看它会崩溃的位置。一切正常,直到我尝试更改 DbContextName。当我这样做时,它坏了。不管我把它改成什么,如果它不是我用于工作 tt 文件的原始上下文名称,它就会崩溃。
这对我来说完全没有意义。
我尝试清理解决方案(此解决方案中的一个项目)。我尝试在清洁解决方案后清除 obj/bin 文件夹。没有效果。太疯狂了。
这有点重复。我简化了代码以缩小发生的范围,并再次发布它,因为我认为人们不会为此烦恼。
解决方案原来是使 dbcontext 名称与连接字符串名称相同。谢谢 Fakhar。
我有一个奇怪的问题,我一直在努力解决。
BulkInsert 在一个数据库中有效,但在另一个数据库中无效,即使 tables 相同。 Visual Studio 2017 年,C#。我使用反向 poco 来构建 entity framework 文件。
每个数据库中的 SQL table 仅包含:
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 文件。它不是数据库或 table。但是我不确定是什么问题引起的。
编辑:所以目前我删除了第二个(非工作)反向 poco tt 文件并尝试更新第一个文件以查看它会崩溃的位置。一切正常,直到我尝试更改 DbContextName。当我这样做时,它坏了。不管我把它改成什么,如果它不是我用于工作 tt 文件的原始上下文名称,它就会崩溃。
这对我来说完全没有意义。
我尝试清理解决方案(此解决方案中的一个项目)。我尝试在清洁解决方案后清除 obj/bin 文件夹。没有效果。太疯狂了。
这有点重复。我简化了代码以缩小发生的范围,并再次发布它,因为我认为人们不会为此烦恼。
解决方案原来是使 dbcontext 名称与连接字符串名称相同。谢谢 Fakhar。