Clone LINQ To SQL Расширение объекта вызывает исключение удаления объекта - PullRequest
0 голосов
/ 16 июня 2010

У меня есть этот метод расширения для клонирования моих объектов LINQ To SQL:

public static T CloneObjectGraph<T>(this T obj) where T : class 
{
    var serializer = new DataContractSerializer(typeof(T), null, int.MaxValue, false, true, null);
    using (var ms = new System.IO.MemoryStream())
    {
        serializer.WriteObject(ms, obj);
        ms.Position = 0;
        return (T)serializer.ReadObject(ms);
    }
}

Но в то время как я несу объекты с не всеми загруженными ссылками, в то время как qyuerying с DataLoadOptions, иногда он выбрасывает исключение удаленного объекта, но я не запрашивать ссылки, которые не загружены (ноль).

например. У меня есть Клиент со многими ссылками, и мне просто нужно сохранить в памяти адресную ссылку EntityRef <>, и я больше ничего не загружаю. Но пока я клонирую объект, это исключение вынуждает меня загрузить все ссылки EntitySet <> с объектом Customer, что может быть слишком много и замедлить скорость приложения.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 16 июня 2010

По моему опыту, лучше по возможности избегать сериализации объектов LINQ to SQL. Скорее используйте объекты передачи данных ( DTO ). Они будут просто содержать данные и не будут трудно сериализовать ссылки и скрытые соединения с DataContext. Таким образом, их легко сериализовать и сериализовать только то, что нужно для сериализации.

0 голосов
/ 16 июня 2010

Предположим, у вас есть клиент с некоторыми заказами.

  • Если вы используете LoadOptions.LoadWith<Customer>(c => c.Orders), вы получите клиента и заполненный клиент. Заказы EntitySet.
  • Есливы не получаете, вы получаете клиента и ленивый загружаемый клиент. Заказы EntitySet.Любая попытка перечислить свойство Orders приводит к тому, что DataContext загружает заказы этого клиента.

Теперь, когда у вас есть Клиент, вы должны распоряжаться DataContext, как это должно быть (предпочтительно с отметкой using).).

И через некоторое время вы сериализуетесь.Код сериализации перечисляет свойство Orders.DataContext, который будет загружать эти Заказы, пропал, и вы получите сообщение об ошибке.

Проверьте EntitySet.IsDeferred и EntitySet.HasLoadedOrAssignedValues ​​.


Я не уверен на 100% в решении, но я бы попробовал что-то сложное, например:

if (!c.Orders.HasLoadedOrAssignedValues)
{
  c.Orders = null;
}

в качестве предварительного шага к сериализации.Любые ленивые EntitySets должны быть отключены от Клиентов.

...