有没有一种方法可以在C#中保存数据集中的对象列表

时间:2019-11-24 17:48:29

标签: c# datatable dataset

我想在xml中保存日期列表,我想使用数据集来完成任务,我对使用Entity Framework的数据库也是如此。这使我可以使用event.eventDates.start访问日期 但是在数据集中我无法实现。

   public class Event
    {
        [Key]
        public string id { get; set; }

        public virtual ICollection<Date> eventDates { get; set; }
    }

日期课程

   public class Date
    {
        public DateTime start { get; set; }
        public DateTime end { get; set; }
    }

使用实体框架时,我可以使用event.eventDates.start访问eventDates对象 我在数据集构建器中映射了来自sql数据库的数据,其关系看起来像这样

enter image description here

我希望xml文件采用这种格式

<?xml version="1.0" standalone="yes"?>
<db xmlns="http://tempuri.org/LocalDB.xsd">
  <Event>
    <id>ID</id>
    <eventdates>
      <date>
         <startdate></startdate>
         <enddate></enddate>
      <date>  
      <date>
         <startdate></startdate>
         <enddate></enddate>
      <date>  
    </eventdates>
  </Event>
</db>

有什么方法可以使用数据集实现这一目标? 我是C#的新手,将不胜感激

2 个答案:

答案 0 :(得分:0)

此代码基于generate xml files based on my c# classes有效。我会将您的课程重命名为“事件”和“日期”以外的名称。这些名称太笼统,通常受系统保护。 ICollection不可序列化。阅读XML serialization of interface property。您可以使用DTO或更改集合类型(即使用List <>)和XML序列化属性,避免循环引用和/或禁用延迟加载(即,通过Include方法使用急切加载),否则可能会导致整个序列化数据库。

Program.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace EFToXml
{
    public class MyEvent
    {
        public string Id { get; set; }

        public virtual List<MyDate> EventDates { get; set; }
    }

    public class MyDate
    {
        public DateTime Start { get; set; }
        public DateTime End { get; set; }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            var myDate1 = new MyDate
            {
                Start = DateTime.Now,
                End = DateTime.Now.AddDays(1)
            };
            var eventDates = new List<MyDate> { myDate1 };
            var myEvent = new MyEvent
            {
                Id = "1",
                EventDates = eventDates
            };

            XmlSerializer serializer = new XmlSerializer(typeof(MyEvent));
            serializer.Serialize(File.Create(@"C:\Users\<UserName>\Source\Repos\myEvents.xml"), myEvent);

        }
    }
}

myEvents.xml:

<?xml version="1.0"?>
<MyEvent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id>1</Id>
  <EventDates>
    <MyDate>
      <Start>2019-11-24T21:52:04.5032671+01:00</Start>
      <End>2019-11-25T21:52:04.5194026+01:00</End>
    </MyDate>
  </EventDates>
</MyEvent>

答案 1 :(得分:0)

如果我理解正确,则只想使用数据集重现EntityFramework的行为。 只需使用适当的表,字段和关系创建DataSet(使用集成的VisualStudio设计器),就可以实现完全相同的事情:

Dataset example

随后您可以使用以下代码访问数据:

var ds = new DataSet1();
var ue = ds.UserEvents.FirstOrDefault();
var ued = ue.GetChildRows("FK_UserEvents_EventDates")
          .Cast<DataSet1.EventDatesRow>();

var date = ued.FirstOrDefault().Date;

接下来要做的是序列化-这很容易: Serialization example