0

我有一些从数据库中获取的 .NET 4 实体框架对象,然后我将它们序列化为 XML。然后我退出 WPF 应用程序(清除内存)。然后我重新启动 WPF 应用程序并将它们读回(反序列化)到 List<> 但从不将它们附加到任何 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 文件加载对象,对象永远不会 Attach()-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()

问题:我现在的表中有两倍的匹配行

4

1 回答 1

0

由于您将对象从一个上下文中序列化,然后将它们反序列化回具有不同上下文的对象,因此您将看到这种行为。一旦你从当前上下文中分离了一个对象/项目,如果你打开另一个上下文并且不将它重新附加到当前上下文,上下文将认为它是一个新对象。在这种情况下,一种选择可能是向我们提供您已缓存的费率 ID,以便在上下文中调用 .SaveChanges() 方法之前从上下文中提取这些费率,然后使用上下文中的这些费率而不是缓存对象。我最终需要在我当前的 MVC 应用程序中做一些与此非常相似的事情,因为我通过 JSON 发送一个复杂的模型,如果我希望子集合正确保存,我需要使用空子集合复制父对象并将其附加到上下文中。然后我直接从上下文中查询 JSON 对象的每个属性中的子对象,并在保存之前将上下文中的子对象分配给附加对象的子对象。这似乎对我有用。如果我尝试将反序列化的 JSON 对象与子对象一起保存,我最终会在我的数据库中获得重复的子行。

于 2011-07-27T02:30:35.250 回答