如何使用ICollection <t> </t>在EF5中序列化

时间:2013-05-14 11:51:18

标签: c# xml serialization entity-framework-5 .net-4.5

我正在使用.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序列化\反序列化到\这个简单的类结构?它甚至可能吗?

1 个答案:

答案 0 :(得分: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();
    }
}

您可以使用this setting关闭代理,这样做也可以修复原始代码。

public class MyDbContext : DbContext
{
    public MyDbContext ()
    {
        this.Configuration.ProxyCreationEnabled = false;
    }
    ...
}