Как использовать подход Code-First с Entity Framework для вставки сложного класса, созданного из XML-документа - PullRequest
1 голос
/ 12 июня 2019

Мой клиент мигрирует из веб-CRM, который предоставил им только экспорт XML своих данных.

Экспорт занимает 190 тыс. Строк со многими вложенными объектами.

Я пробовал много онлайн-инструментов, чтобы попытаться преобразовать XML в пригодный для использования класс в C # с ограниченным успехом, включая попытку преобразовать его вJSON использовать QuickType.IO безрезультатно.

Моя цель - использовать Entity Framework (который я использовал только в его самой базовой форме) для создания базы данных SQL Server из файла XML, чтобы я могинтегрировать его и вставлять записи в их новую CRM на основе SQL Server.

Я использовал Visual Studio «Специальная вставка> XML как классы», которая, казалось, лучше всего справлялась с созданием классов.Однако из-за формата экспорта XML он создал такие классы:

    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class exportContactActivitiesCall
    {

        private object[] itemsField;

        private ItemsChoiceType4[] itemsElementNameField;

        private uint idField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("comments", typeof(exportContactActivitiesCallComments))]
        [System.Xml.Serialization.XmlElementAttribute("dateoccured", typeof(string))]
        [System.Xml.Serialization.XmlElementAttribute("details", typeof(string))]
        [System.Xml.Serialization.XmlElementAttribute("duration", typeof(byte))]
        [System.Xml.Serialization.XmlElementAttribute("id", typeof(uint))]
        [System.Xml.Serialization.XmlElementAttribute("parent", typeof(uint))]
        [System.Xml.Serialization.XmlElementAttribute("timerecords", typeof(exportContactActivitiesCallTimerecords))]
        [System.Xml.Serialization.XmlElementAttribute("type", typeof(string))]
        [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
        public object[] Items
        {
            get
            {
                return this.itemsField;
            }
            set
            {
                this.itemsField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")]
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public ItemsChoiceType4[] ItemsElementName
        {
            get
            {
                return this.itemsElementNameField;
            }
            set
            {
                this.itemsElementNameField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public uint id
        {
            get
            {
                return this.idField;
            }
            set
            {
                this.idField = value;
            }
        }
    }
    [System.SerializableAttribute()]
    [XmlTypeAttribute(IncludeInSchema = false)]
    public enum ItemsChoiceType4
    {

        /// <remarks/>
        comments,

        /// <remarks/>
        dateoccured,

        /// <remarks/>
        details,

        /// <remarks/>
        duration,

        /// <remarks/>
        id,

        /// <remarks/>
        parent,

        /// <remarks/>
        timerecords,

        /// <remarks/>
        type,
    }

Я попытался использовать XmlSerializer и EF так:

  XmlSerializer serializer = new XmlSerializer(typeof(export));

            using (FileStream fileStream = new FileStream("content.xml", FileMode.Open))
            {
                var result = (export)serializer.Deserialize(fileStream);


                using (var ctx = new ExportContext())
                {

                    ctx.Export.AddRange(result.contact);
                    ctx.SaveChanges();
                }
            }

Хотя это, кажется, создаетБаза данных без ошибок, она только импортировала поле ID для каждой записи.

Я начал преобразовывать классы, созданные Visual Studio, в объекты вместо перечисления itemChoiceType.И хотя я добиваюсь успеха с этим, мне, вероятно, потребуется некоторое время, чтобы завершить.

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

Или, если кто-нибудь знает хороший способ добиться того, чего я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...