Не получить все поля из класса для вставки в БД с использованием SQLBulkTools - PullRequest
0 голосов
/ 20 февраля 2019

Я использую пакет 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();
        }

    }
...