克隆Linq对象错误“类型'TestLinq.PersonAddress'的对象图包含循环,如果禁用参考跟踪,则无法序列化。”

时间:2009-09-16 11:54:18

标签: c# linq-to-sql serialization

我需要使用linq克隆行。我找到了这个方法:

public static T Clone<T>(this T source)
        {
            var dcs = new System.Runtime.Serialization
              .DataContractSerializer(typeof(T));
            using (var ms = new System.IO.MemoryStream())
            {
                dcs.WriteObject(ms, source);
                ms.Seek(0, System.IO.SeekOrigin.Begin);
                return (T)dcs.ReadObject(ms);
            }
        }

但尝试克隆行时,如db1.Persons.First()。Clone();

我得到这个例外:“类型'TestLinq.PersonAddress'的对象图包含周期,如果禁用参考跟踪,则无法序列化。”

注意:我的表包含1个主键,1个唯一索引包含3个字段

你能帮帮我吗? 感谢
哈密

2 个答案:

答案 0 :(得分:17)

出现此问题是因为linq实体往往在两个方向上的父项和子项之间存在链接。例如,如果您将Order类映射到表,并将OrderItem类映射到另一个表,那么OrderItem表将如下所示:

CREATE TABLE OrderItem( ... OrderId int引用Order(Id) )

生成的linq实体将如下所示:

public class Order
{
    //other members
    public EntitySet<OrderItem> OrderItems { get; }
}

public class OrderItem
{
    //other members
    public Order Order { get; }
}

由于订单与每个OrderItem子项之间存在循环引用,因此无法序列化。如果您正在使用linq2sql设计器来创建这些类,您可以通过单击设计器表面并将“序列化模式”更改为“单向”来指示它仅在一个方向(从父对象)创建引用

答案 1 :(得分:0)

也许发布PersonAddress的实际课程?我想知道,例如,你是否有一个标记为[DataMember]的关联属性,或者根本没有[DataMember];在这种情况下,它会查看字段 - 如果您有一个延迟加载的成员(因此与数据上下文关联),这可能会出现问题。

请注意,如果您只想要一个对象(不是关联),还有其他方法可以进行浅层克隆 - like so, for example