SqlBulkCopy Невозможно вставить значение NULL в столбец

Я пытаюсь добавить в мою базу данных определенный список пользовательских объектов, используя расширение fastmember ( Fastmember NuGet) и sqlbulkcopy. Однако это дает мне следующую ошибку:

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

Additional information: Cannot insert the value NULL into column 'functionblockId', table '\path...\DBFHX.MDF.dbo.connections'; column does not allow nulls. INSERT fails.

The statement has been terminated.

Код:

private void insertConnection(functionblock functionblock)
{
    using (var bcp = new SqlBulkCopy(db.Database.Connection.ConnectionString))
    {
        foreach (connection item in functionblock.connections)
                {
                    item.functionblockId = 1;
                }
        using (var creader = ObjectReader.Create(functionblock.connections, "step", "transition","steptotrans", "functionblockId"))
                {
                    bcp.DestinationTableName = "connections";
                    bcp.WriteToServer(creader);
                }   
    }
}

Используя Model First, Entity Framework сгенерировал следующую таблицу:

CREATE TABLE [dbo].[connections] (
    [Id]              INT            IDENTITY (1, 1) NOT NULL,
    [step]            NVARCHAR (MAX) NOT NULL,
    [transition]      NVARCHAR (MAX) NOT NULL,
    [steptotrans]     BIT            NOT NULL,
    [functionblockId] INT            NOT NULL,
    CONSTRAINT [PK_connections] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_functionblockconnection] FOREIGN KEY ([functionblockId]) REFERENCES [dbo].[functionblocks] ([Id])
);

Код отлично работает для другой таблицы, которая также содержит тот же "functionblockId" и тот же тип других полей (хотя и не содержит битового поля).

Я вручную проверил все свои значения в списке functionblock.connections, а затем в конкретном объекте его 'functionblockId', он был заполнен числом. Еще лучше, как вы видите в коде, я фактически заполняю его жестко, прежде чем я сделаю это.

Понятия не имею, почему возникает эта ошибка, у кого-нибудь есть идея?

2 ответа

Решение

После того, как я вручную создал DataTable с тестовыми данными, он все еще выдал мне ту же ошибку.

Я наткнулся на этот пост ( решение codeproject) и применил SqlBulkCopyColumnMapping к моему случаю.

Пример кода:

using (var bcp = new SqlBulkCopy(fhxm.Database.Connection.ConnectionString))
                                    {
                                    using (var creader = ObjectReader.Create(functionblock.connections, "step", "transition", "steptotrans", "functionblockId"))
                                    {
                                    SqlBulkCopyColumnMapping mapstep = new SqlBulkCopyColumnMapping("step", "step");
                                    SqlBulkCopyColumnMapping maptran = new SqlBulkCopyColumnMapping("transition", "transition");
                                    SqlBulkCopyColumnMapping mapstt = new SqlBulkCopyColumnMapping("steptotrans", "steptotrans");
                                    SqlBulkCopyColumnMapping mapfunc = new SqlBulkCopyColumnMapping("functionblockId", "functionblockId");
                                    bcp.ColumnMappings.Add(mapstep);
                                    bcp.ColumnMappings.Add(maptran);
                                    bcp.ColumnMappings.Add(mapstt);
                                    bcp.ColumnMappings.Add(mapfunc);

                                    bcp.DestinationTableName = "connections";
                                    bcp.WriteToServer(creader);
                                    }   } 

Не очень знакомый с этим синтаксисом, однако: интересно, действительно ли объект 'item' используется в транзакции. Похоже, ObjectReader.Create выполняет шаги через соединения, независимо от ссылки "item".

Попробуйте уменьшить количество транзакций, чтобы убедиться, что поступает правильное количество строк, потому что вы можете наступить на итератор.

также, возможно, вы можете попробовать перехватить неожиданные значения item.functionblockId в качестве диагностического инструмента.

Другие вопросы по тегам