Использование 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, поэтому я ценю любую помощь / понимание.