2013-05-14 64 views
3

我使用.NET 4.5和Entity Framework 5.0。 我有3個使用Code-First方法創建的基本實體類。現在我試圖序列化它,但無法完成。如何EF5序列化與ICollection的<T>

這裏的類的基本知識:

基類

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") 
    { 
    } 
} 

我tryed用序列:

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 \類這種簡單的結構?它甚至有可能嗎?

回答

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; 
    } 
    ... 
} 
+0

Tryed它和它沒有工作給予了以下異常:'消息\t「是沒有預料到的類型System.Data.Entity.DynamicProxies.Parent_E76FB33E6995E673A0E176C3BF1491089D201114AF560D2CB455BDBBD74C633A使用XmlInclude或SoapInclude屬性來指定類型不知道靜態。「' – Gil 2013-05-14 13:34:45

+1

@Gil該消息是確認您有EF代理類。您可能必須創建單獨的DTO類,這些類可以被序列化,並使用類似AutoMapper的方法將數據複製到另一個或另一個。 – qujck 2013-05-14 13:39:06

+0

如果我添加'[XmlIgnore]'公共虛擬的ICollection 的'頂部規則{獲得;組; }'在ParentEntity中,我可以對它進行序列化,但它認爲問題在'ICollection '內。有沒有包裝或一種方法來序列化內容而不創建DTO的? – Gil 2013-05-14 13:58:50

相關問題