2016-01-13 50 views
0

我有一个基于ObservableCollection的数据网格中显示的EF数据库上下文。用户可以编辑网格,并且全部显示正常。查找Observable Collection中更改的项目

但是我现在需要将数据发送回数据库。我不想将集合中的所有项目都发送到我的保存方法,所以我只能找到已在集合中进行更改的项目?

+4

了,更换项目4您尝试使用'DbContext.SaveChanges'保存所有内容并遇到性能问题?这些框架通常非常聪明,可以避免不必要的工作。 – Jens

+0

我同意@Jens,如果你没有在EF中做任何配置更改,它应该跟踪实体的变化并决定是否应该保存。 – chameleon86

+0

如果通过“发送到数据库”,您的意思是简单地将实体保存到本地数据库,那么我同意@Jens。但是,如果您在远程服务器上使用数据库(例如,通过_WCF_服务),并且您只想传输脏实体以减少网络流量,则“ObservableCollection ”中没有内置功能来跟踪对其项目的更改。你可以看看['BindingList '](https://msdn.microsoft.com/en-us/library/ms132679(v=vs.110).aspx)(及其ListChanged事件)。或者,如果可能的话,创建空的_EF_上下文,用初始对象填充它,并利用其跟踪机制。 – Grx70

回答

0

您可以使用NotifyCollectionChangedAction检测哪些项目已在ObservableCollection

被改变。然而,仅仅Jens说,最好的办法是让EF为您处理。

干杯。

ObservableCollection<int> listOfObject = new ObservableCollection<int>() { 1, 2, 3, 4}; 

listOfObject.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(
    delegate (object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
    if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
     { 
      Console.WriteLine($"{e.NewItems[0]} just been added to the list at index = {e.NewStartingIndex}"); 
     } 
     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Replace) 
     { 
      Console.WriteLine($"Replace item {e.OldItems[0]} with {e.NewItems[0]}"); 
     } 
    } 
); 

listOfObject.Add(1); 
listOfObject[2] = 3; 
listOfObject[3] = 1; 

输出:

1刚刚被添加到所述列表中索引= 4

替换项3 3

用1

+0

嗨,谢谢,请看我对@Jens的看法,为什么我认为EF不适合我。但是感谢我将要测试的这个解决方案。有没有办法解决我的EF问题? –

相关问题