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

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

public static T Clone(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个字段

请你帮助我好吗
谢谢
哈米德

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

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

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

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

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

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

请注意,如果您只想要一个对象(不是关联),还有其他方法可以执行浅层克隆 – 例如,如此 。