3

我正在使用 .Net 4.5 和 Entity Framework 5.0。我有 3 个使用 Code-First 方法创建的基本实体类。现在我正在尝试序列化它并且无法。

以下是课程的基础知识:

基类

public class BaseEntity
{
  [Key]
  public int Id {get; set;}

  public DateTime StartDate { get; set; }
  public DateTime EndDate { get; set; }
}

派生类

public class ChildEntity : BaseEntity
{
    public int ParentId { get; set; }

    [ForeignKey("ParentId")]
    public ParentEntity ParentEntity { get; set; }

    public string Description { get; set; }
}


public class ParentEntity : BaseEntity
{
    public virtual ICollection<ChildEntity> Rules { get; set; }

    public RuleGroup()
    {
      this.Rules = new HashSet<ChildEntity>();
    }
}

我的上下文类

public class MyDbContext : DbContext
{
    public DbSet<ParentEntity> Parents { get; set; }
    public DbSet<ChildEntity> Childs { get; set; }

    public MyDbContext()
        : base("MyDbContext")
    {
    }
}

我尝试使用以下方式进行序列化:

using (var context = new MyDbContext())
{
    using (var writer = XmlWriter.Create(destinationFile))
    {
        var serializer = new XmlSerializer(typeof(List<Parents>));
        serializer.Serialize(writer, context.Parents.ToList());
    }
}

但看起来我无法序列化ICollection<T>

将其更改为List<T>但仍然给我带来问题。

我怎样才能序列化\反序列化到\从 XML 这个简单的类结构?甚至可能吗?

4

1 回答 1

0

另一种解决方案是自己迭代集合。如果您使用 EF 代理类进行更改跟踪/延迟加载,您会发现这仍然会给您带来问题(在我看来,这就像您拥有virtual ICollection的那样)。

using (var context = new MyDbContext())
{
    using (var writer = XmlWriter.Create(destinationFile))
    {
        var serializer = new XmlSerializer(typeof(Parent));
        writer.WriteStartElement("ArrayOfParent");
        foreach(Parent parent in BdContext.Parents)
        {
            serializer.Serialize(writer, parent);
        }
        writer.WriteEndElement();
    }
}

您可以使用此设置关闭代理,这样做也应该可以修复您的原始代码。

public class MyDbContext : DbContext
{
    public MyDbContext ()
    {
        this.Configuration.ProxyCreationEnabled = false;
    }
    ...
}
于 2013-05-14T12:11:50.957 回答