我需要使用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个字段
你能帮帮我吗? 感谢答案 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。