3

.Net 4.5 と Entity Framework 5.0 を使用しています。Code-First アプローチを使用して作成された 3 つの基本的なエンティティ クラスがあります。今、私はそれをシリアル化しようとしていますが、できません。

クラスの基本は次のとおりです。

基本クラス

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 Proxy クラスを使用している場合、これでも問題が発生することがわかります (私には、あなたが持っているように見えます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 に答える