我有一些.NET 4实体框架对象,我从DB获取,然后我将它们序列化为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() - 编辑到任何上下文。
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()
问题:我现在在表格中有两倍的匹配行
答案 0 :(得分:0)
由于您将对象从一个上下文序列化,然后将它们反序列化为具有不同上下文的对象,您将看到此行为。从当前上下文中分离对象/项后,如果打开另一个上下文并且不将其重新附加到当前上下文,则上下文会认为它是一个新对象。在这种情况下,一种选择可能是我们已经缓存的速率的ID,以便在上下文中调用.SaveChanges()方法之前从上下文中提取这些速率,然后使用上下文中的那些速率而不是缓存的对象。我最终需要在我当前的MVC应用程序中执行与此类似的操作,因为我通过JSON发送复杂模型,如果我希望子集合正确保存,我需要将父对象复制并附加到上下文中空子集合。然后,我直接从上下文查询JSON对象上每个属性中的子对象,并在保存之前将上下文中的子对象分配给附加对象的子对象。这似乎对我有用。如果我尝试仅使用子节点保存反序列化的JSON对象,我最终会在数据库中获取重复的子行。