Linq to sql 克隆LINQ到SQL对象扩展方法引发对象处置异常

Linq to sql 克隆LINQ到SQL对象扩展方法引发对象处置异常,linq-to-sql,serialization,c#-3.0,clone,datacontract,Linq To Sql,Serialization,C# 3.0,Clone,Datacontract,我使用此扩展方法克隆LINQ到SQL对象: public static T CloneObjectGraph<T>(this T obj) where T : class { var serializer = new DataContractSerializer(typeof(T), null, int.MaxValue, false, true, null); using (var ms = new System.IO.MemoryStream()) {

我使用此扩展方法克隆LINQ到SQL对象:

public static T CloneObjectGraph<T>(this T obj) where T : class 
{
    var serializer = new DataContractSerializer(typeof(T), null, int.MaxValue, false, true, null);
    using (var ms = new System.IO.MemoryStream())
    {
        serializer.WriteObject(ms, obj);
        ms.Position = 0;
        return (T)serializer.ReadObject(ms);
    }
}
publicstatict克隆对象图(这个T对象),其中T:class
{
var serializer=新的DataContractSerializer(typeof(T),null,int.MaxValue,false,true,null);
使用(var ms=new System.IO.MemoryStream())
{
serializer.WriteObject(ms,obj);
ms.Position=0;
return(T)serializer.ReadObject(ms);
}
}
但是,虽然我携带的对象并没有加载所有引用,而QYUE使用DataLoadOptions进行尝试,但有时它会抛出对象处理异常,但问题是我 不要请求未加载的引用(null)

e、 g.我的客户有很多参考资料,我只需要继续存储地址参考EntityRef,我不加载任何其他内容。但是,当我克隆对象时,这个异常会迫使我加载客户对象的所有EntitySet引用,这可能会太多,并降低应用程序的速度


有什么建议吗?

假设您有一位客户,有一些订单

  • 如果您使用
    LoadOptions.LoadWith(c=>c.Orders)
    ,您将获得一个客户和一个填充的客户。Orders
    EntitySet
  • 如果不这样做,您将得到一个客户和一个懒惰的可加载客户。Orders
    EntitySet
    。任何枚举Orders属性的尝试都将导致
    DataContext
    加载此客户的订单
现在您已经有了客户,您可以按照应该的方式处理DataContext(最好使用
语句)

在那之后的一段时间里,您将序列化。序列化代码枚举Orders属性。加载这些订单的
DataContext
已消失,您将得到错误

退房并离开


我不是100%确定解决方案,但我会尝试一些严厉的方法,如:

if (!c.Orders.HasLoadedOrAssignedValues)
{
  c.Orders = null;
}

作为序列化的前一步。任何惰性EntitySet都必须与客户断开连接。

根据我的经验,如果可能,最好不要将LINQ序列化为SQL对象。而是使用数据传输对象()。它们只包含数据,不难序列化对
DataContext
的引用和隐藏连接。通过这种方式,可以很容易地序列化它们,并且只序列化需要序列化的内容。

我认为我在应用程序中达到的这一步最好的方法是加载我可能需要的大部分参考,然后在我的下一个应用程序中使用PLinqo或开始学习EF 4。我不太确定你对DTO的意思,如果可以,请应用一个示例。谢谢你的回答。我添加了一个到维基百科的链接,解释数据传输对象,但它们基本上没有什么特别之处。它们是POCO(普通的旧CLR对象),在您的例子中是可序列化的POCO。下面是我写的关于DTO的一个非常好的答案。我想这也回答了你的问题: