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

Ham*_*mid 7 c# serialization linq-to-sql

我需要使用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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

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

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

能帮帮我吧
谢谢
哈米德

Lee*_*Lee 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; }
}
Run Code Online (Sandbox Code Playgroud)

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