десериализованные объекты Entity Framework, создающие дубликаты записей в моей базе данных - PullRequest
0 голосов
/ 27 июля 2011

У меня есть несколько объектов инфраструктуры сущностей .NET 4, которые я получаю из БД, затем я сериализую их в XML. Затем я закрываю приложение WPF (очищаю память). Затем я перезапускаю приложение WPF и читаю их (десериализацию) обратно в список <>, но никогда не присоединяю их к какому-либо контексту EF. Когда я вызываю SaveChanges () в моем объектном контексте, он создает дублирующиеся записи, но я никогда не присоединял десериализованный к контексту, поэтому я не уверен, почему новый контекст создает копии записей. Имеет ли это какое-то отношение к сущностям самоконтроля http://msdn.microsoft.com/en-us/library/ff407090.aspx?

Вот обзор ...

Запустить приложение

Запрос объектов в ObjectSet.ToList () _cachedRates

IQueryable<Rate> query = DB.EF.Rates.Where({some predicates});

if (query != null && query.Count() > 0)
    _cachedRates = query.ToList();

Сериализация в XML

XmlSerializer serializer = new XmlSerializer(_cachedRates.GetType());
TextWriter textWriter = new StreamWriter(saveDialog.FileName);
serializer.Serialize(textWriter, _cachedRates);
textWriter.Close();

Закрыть приложение

... {} позже ...

Запустите приложение снова

Загрузка объектов из файла XML, объекты никогда не присоединяются () - ed или AddObject () - ed к любому контексту.

if (openDialog.ShowDialog().Value)
{
    _cachedRates = null;

    XmlSerializer deserializer = new XmlSerializer(typeof(List<Rate>));
    TextReader textReader = new StreamReader(openDialog.FileName);
    _cachedRates = (List<Rate>)deserializer.Deserialize(textReader);
    textReader.Close();
}

Если пользователь нажимает кнопку «Сохранить», он вызывает .SaveChanges () в контексте

ПРОБЛЕМА: у меня теперь в два раза больше совпадающих строк в моей таблице

1 Ответ

0 голосов
/ 27 июля 2011

Поскольку вы сериализуете свои объекты из одного контекста, а затем десериализуете их обратно в объект с другим контекстом, вы увидите это поведение. Как только вы отсоедините объект / элемент от текущего контекста, если вы откроете другой контекст и не подключите его к текущему контексту, контекст будет думать, что это новый объект. Один из вариантов в этом сценарии может быть для нас идентификаторами тарифов, которые вы кэшировали, чтобы извлечь эти тарифы из контекста до вызова метода .SaveChanges () из контекста, а затем работать с этими ставками из контекста вместо кешированный объект. В итоге мне нужно сделать что-то очень похожее на это в моем текущем приложении MVC, так как я отправляю сложную модель через JSON, и если я хочу, чтобы дочерние коллекции сохранялись правильно, мне нужно скопировать и присоединить родительский объект к контексту с помощью пустые дочерние коллекции. Затем я запрашиваю дочерние объекты в каждом свойстве объекта JSON непосредственно из контекста и назначаю объекты из контекста дочерним объектам присоединенного объекта перед сохранением. Кажется, это работает для меня. Если я попытаюсь просто сохранить десериализованный объект JSON с дочерними элементами, я получу дубликаты дочерних строк в своей базе данных.

...