Ошибка объекта Clone Linq «Граф объектов для типа« TestLinq.PersonAddress »содержит циклы и не может быть сериализован, если отслеживание ссылок отключено». - PullRequest
6 голосов
/ 16 сентября 2009

Мне нужно клонировать строку, используя 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 ]

17 голосов
/ 16 сентября 2009

Эта проблема возникает из-за того, что сущности 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 desiger для создания этих классов, вы можете указать, чтобы он создавал ссылки только в одном направлении (от родителя к потомку), щелкнув по поверхности конструктора и изменив «Режим сериализации» на «Однонаправленный»

0 голосов
/ 16 сентября 2009

Может быть, опубликовать фактический класс для PersonAddress?Интересно, например, есть ли у вас свойство ассоциации с пометкой [DataMember] или вообще без [DataMember] s;в этом случае он просматривает поля - которые могут сработать, если у вас есть лениво загруженный элемент (и, следовательно, связь с контекстом данных).

Обратите внимание, что если вам нужен только один объект (не ассоциации)Существуют и другие способы создания мелкого клона - , например, .

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...