当实体框架代理的类被装饰时,如何序列化实体框架代码优先代理DataContractAttribute(IsReference = true)
?
当将 DataContractSerializer 与 ProxyContractResolver 一起使用时,我得到以下信息:
类型“System.Data.Entity.DynamicProxies.MyType_59A83378572C10D0B31B6892FB6C3E7428C4BA214322C7A77BD5E1EB19E529CA”的 IsReference 设置为“False”,但其父类“My.Namespace.MyType”的相同设置为“True”。派生类型的 IsReference 值必须与基类型相同。更改类型设置
EF 代理生成器似乎不尊重 IsReference 属性,而我在 POCO 上确实需要该属性(否则我最终会因相互引用而出现堆栈溢出)。
在这种情况下是否有任何机制可以序列化 EF 代理?如何?
我只是做了以下非常简单的例子ProxyDataContractResolver
按预期工作 - 具有周期的代理实体图已正确序列化。
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Objects;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
namespace CFSerialization
{
class Program
{
static void Main(string[] args)
{
using (var context = new Context())
{
context.Database.Delete();
context.Database.CreateIfNotExists();
context.Masters.Add(new Master
{
Name = "abc",
Details = new List<Detail>
{
new Detail { Name = "a" },
new Detail { Name = "b" },
new Detail { Name = "c" }
}
});
context.SaveChanges();
}
using (var context = new Context())
{
// This will get proxied Master
var master = context.Masters.First();
var serializer = new DataContractSerializer(typeof(Master), new DataContractSerializerSettings()
{
DataContractResolver = new ProxyDataContractResolver()
});
using (var stream = new MemoryStream())
{
// This will also lazy load all details
serializer.WriteObject(stream, master);
stream.Seek(0, SeekOrigin.Begin);
var newMaster = (Master)serializer.ReadObject(stream);
}
}
}
}
[DataContract(IsReference=true)]
public class Master
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public virtual ICollection<Detail> Details { get; set; }
}
[DataContract(IsReference=true)]
public class Detail
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public virtual Master Master { get; set; }
}
public class Context : DbContext
{
public DbSet<Master> Masters { get; set; }
}
}
您的模型中必须存在更复杂的东西来破坏功能 - 您的所有实体都标记为DataContract(IsReference=true)
?
注意:我在.NET 4.5 中测试了它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)