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