【问题标题】:Clone Linq object Error "Object graph for type 'TestLinq.PersonAddress' contains cycles and cannot be serialized if reference tracking is disabled."克隆 Linq 对象错误“'TestLinq.PersonAddress' 类型的对象图包含循环,如果禁用引用跟踪,则无法序列化。”
【发布时间】:2009-09-16 11:54:18
【问题描述】:

我需要使用 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 个字段

你能帮帮我吗
谢谢
哈米德

【问题讨论】:

    标签: c# linq-to-sql serialization


    【解决方案1】:

    出现此问题是因为 linq 实体往往在父项和子项之间具有双向链接。例如,如果您有一个 Order 类映射到一个表,而一个 OrderItem 类映射到另一个表,您会期望 OrderItem 表如下所示:

    创建表 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,它帮助了很多人!
    • 现在可以做到这一点...... NET 3.5SP1 在 DataContract 中添加了对“IsReference”属性的支持。我相信 EF 有内置支持,但 LINQ2SQL 需要 L2ST4 之类的东西。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2012-03-12
      • 2021-02-13
      • 2018-01-16
      • 2015-06-01
      • 1970-01-01
      相关资源
      最近更新 更多