Я использую пакет C # https://github.com/tiagorosendo/SqlBulkTools.
У меня есть список объектов, которые содержат данные, которые я хочу массово вставить в мою БД.
Вот мой объект:
using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.Xml.Serialization;
namespace CFDE.Model
{
[XmlRoot(ElementName = "OwnershipPeriod")]
public class OwnershipPeriod : ChathamBase
{
[XmlElement(ElementName = "OwnershipPercentage")]
[Column(TypeName = "decimal")]
public Nullable<decimal> OwnershipPercentage;
[XmlElement(ElementName = "OwnershipPercentageEffectiveDate")]
[Column(TypeName = "datetime")]
public Nullable<DateTime> OwnershipPercentageEffectiveDate;
[XmlElement(ElementName = "OwnershipStructure")]
[Column(TypeName = "varchar")]
public string OwnershipStructure;
}
}
Это базовый класс (ничего особенного).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CFDE.Model
{
interface IChathamBase
{
int TransactionIdentifier { get; set; }
}
public class ChathamBase : IChathamBase
{
public int TransactionIdentifier { get; set; }
}
}
Ниже приведен код, который я использую для переноса данных в мою БД.
internal static void BulkUpsert(string connectionName, List<OwnershipPeriod> op)
{
BulkOperations bulk = new BulkOperations();
using (TransactionScope trans = new TransactionScope())
{
using (SqlConnection cn = GetConnection(connectionName))
{
bulk.Setup<OwnershipPeriod>()
.ForCollection(op)
.WithTable("OwnershipPeriod")
.AddAllColumns()
//.AddColumn(x => x.TransactionIdentifier)
//.AddColumn(x => x.OwnershipPercentage)
.BulkInsertOrUpdate()
//.SetIdentityColumn(x => x.TransactionIdentifier)
.MatchTargetOn(x => x.TransactionIdentifier)
.Commit(cn);
}
trans.Complete();
}
}
Моя проблема в том, что моя таблица в БД имеет 4 столбца.Один из базового класса и 3 из класса.Единственный столбец, который вставляется / обновляется, - это первый столбец (из базового класса).
Я использую этот же код для другого класса, который также наследуется от того же базового класса, и он отлично работает.
Единственное, что я определил, это то, что все поля в этом классе имеют типы данных Nullable, но я не знаю, как обойти это.Мне нужно, чтобы те, которые помечены как обнуляемые, как XML, из которого я извлекаю данные, имеют эти поля обнуляемые.
Есть ли другой способ извлечь их из XML во время десерилизации?
Есть ли другой способ идентифицировать их, чтобы получить их для Вставки в БД?
Ищете что-нибудь, что может указать мне правильное направление ....
Класс, которыйработает
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace CFDE.Model
{
[XmlRoot(ElementName = "LoanIdentifiers")]
public class LoanIdentifiers
{
[XmlElement(ElementName = "TransactionIdentifier")]
public int TransactionIdentifier { get; set; }
[XmlElement(ElementName = "TransactionQuoteIdentifier")]
public int TransactionQuoteIdentifier { get; set; }
[XmlElement(ElementName = "DebtIdentifier")]
public string DebtIdentifier { get; set; }
[XmlElement(ElementName = "DebtDescription")]
public string DebtDescription { get; set; }
[XmlElement(ElementName = "CorporateId")]
public string CorporateId { get; set; }
[XmlElement(ElementName = "ReferenceNumberInternal")]
public string ReferenceNumberInternal { get; set; }
[XmlElement(ElementName = "ReferenceNumberLender")]
public string ReferenceNumberLender { get; set; }
[XmlElement(ElementName = "ReferenceNumberLoan")]
public string ReferenceNumberLoan { get; set; }
[XmlElement(ElementName = "ReferenceNumberChatham")]
public string ReferenceNumberChatham { get; set; }
[XmlElement(ElementName = "Hypo")]
public string Hypo { get; set; }
[XmlElement(ElementName = "TransactionCreateDate")]
public DateTime TransactionCreateDate { get; set; }
[XmlElement(ElementName = "ScheduleLastModifiedDate")]
public DateTime ScheduleLastModifiedDate { get; set; }
}
}
internal static void BulkUpsert(string connectionName, IEnumerable<LoanIdentifiers> li)
{
BulkOperations bulk = new BulkOperations();
using (TransactionScope trans = new TransactionScope())
{
using (SqlConnection cn = GetConnection(connectionName))
{
bulk.Setup<LoanIdentifiers>()
.ForCollection(li)
.WithTable("LoanIdentifiers")
.AddAllColumns()
.BulkInsertOrUpdate()
//.SetIdentityColumn(x => x.TransactionIdentifier)
.MatchTargetOn(x => x.TransactionIdentifier)
.Commit(cn);
}
trans.Complete();
}
}