在我的数据库中创建重复记录的反序列化实体框架对象



我有一些。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 ()

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

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

最新更新