Использование SqlBulkCopy с FastMember ObjectReader завершается неудачно, если целью является Guid

У меня есть сущность с несколькими направляющими, представляющими идентификатор таблицы и внешние ключи. Я пытаюсь использовать FastMember для создания объекта IDataReader из списка его объектов данных. Сущность автоматически генерируется с использованием Entity Framework. Когда я запускаю SqlBulkCopy, я не получаю ожидаемую вставку. Иногда, но не каждый раз, я получаю сообщение об ошибке : неверное приведение типа "System.String" к "System.Guid".
Трассировка стека, которая не кажется полезной,
в System.Convert.DefaultToType (значение IConvertible, тип targetType, поставщик IFormatProvider)
в System.String.System.IConvertible.ToType (Тип типа, поставщик IFormatProvider)
в System.Convert.ChangeType (значение объекта, тип преобразование типа, поставщик IFormatProvider)
в System.Data.SqlClient.SqlParameter.CoerceValue (Значение объекта, MetaType destinationType, Boolean & coercedToDataFeed, Boolean & typeChanged, Boolean allowStreaming)

Вот сущность:

[Table("HA_LineItemOptions")]
public partial class HA_LineItemOptions
{
    public System.Guid ID { get; set; }
    public System.Guid LineItemID { get; set; }
    public int ArchiveSetNumber { get; set; }
    public int WindowSetNumber { get; set; }
    public int WindowNumber { get; set; }
    public int GlassNumber { get; set; }
    public string QuestionGroup { get; set; }
    public string Question { get; set; }
    public string Answer { get; set; }
    public Nullable<System.Guid> QuestionID { get; set; }
    public Nullable<System.Guid> AnswerID { get; set; }
}

По запросу редактируется для включения таблицы sql.

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[HA_LineItemOptions](
    [ID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [LineItemID] [uniqueidentifier] NOT NULL,
    [ArchiveSetNumber] [int] NOT NULL,
    [WindowSetNumber] [int] NOT NULL,
    [WindowNumber] [int] NOT NULL,
    [GlassNumber] [int] NOT NULL,
    [QuestionGroup] [varchar](100) NULL,
    [Question] [varchar](100) NULL,
    [Answer] [varchar](8000) NULL,
    [QuestionID] [uniqueidentifier] NULL,
    [AnswerID] [uniqueidentifier] NULL,
 CONSTRAINT [PK_HA_LineItemOptions] PRIMARY KEY CLUSTERED 
(
    [ID] ASC,
    [ArchiveSetNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Первичный ключ в таблице - это ID и ArchiveSetNumber. Я попытался добавить атрибуты ключа после прочтения того, что хранилище данных должно знать первичный ключ, но это не изменило его поведение.

Вот моя вставка SqlBulkCopy:

private async Task CreateBulkInsertAsync(IList<HA_LineItemOptions> lineItemOptions )
        { 
            using(var context = EntityContext.GetMwCxtFor(_programContext))
            using (var conn = new SqlConnection(context.Database.Connection.ConnectionString))
            {
              if (conn.State != ConnectionState.Open)
                    conn.Open();
                context.Database.CommandTimeout = 0;

                var trans = conn.BeginTransaction();
                try
                {
                    using (var sqlCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans))
                    using (var reader = ObjectReader.Create(lineItemOptions))
                    {
                        var type = typeof(HA_LineItemOptions);
                        var accessor = TypeAccessor.Create(type);
                        var members = accessor.GetMembers();
                        foreach (var member in members)
                        {
                            sqlCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(member.Name, member.Name));
                        }
                        sqlCopy.BatchSize = 10000;
                        sqlCopy.BulkCopyTimeout = 0;
                        sqlCopy.DestinationTableName = "HA_LineItemOptions";
                        await sqlCopy.WriteToServerAsync(reader);
                    }
                }
               finally
                {
                    trans.Dispose();
                    conn.Close();
                }
            }
        } 

Я хотел бы использовать SqlBulkCopy в этом сценарии, потому что я могу вставлять до 100000 строк. Я переключился на метод Dapper's InsertAsync, и он ведет себя так, как и должен. Кажется, я не могу найти что-то конкретное для того, что мне нужно делать с Guids, поэтому я ценю любую помощь / понимание.

0 ответов

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