ORM,DataBinding to DataGridView:插入/删除未保存到数据库的新行

我对ORM很新,而且我现在正在尝试使用Telerik OpenAccess ORM,但这个问题可能实际上并不是特定于ORM,而且我还没有完全确定那个ORM。

我想要实现的是绑定DataGridView以显示Customers对象的集合,显示customer表中的所有客户。

我已将它绑定到BindingSource并将BindingSource绑定到DataGridView控件。

我可以成功修改现有项目(使用OpenCccess ORM的SaveChanges方法)。 保存时,内容将按照我的预期保存回数据库。

但是,如果我从DataGridView中删除一行或添加新行,则它们不会保存到数据库中,也不会出现任何错误消息或exception。

理想情况下,我希望能够使用ORM执行所有可能的CRUD操作,就像我可以使用典型的DataTable执行此操作一样…

执行绑定的代码如下所示:

List ukCustomers = (from c in diagrams.Customer where c.Country == "UK" select c).ToList(); customersBindingSource.DataSource = ukCustomers; customersBindingSource.AllowNew = true; 

我目前的猜测是,用户添加到DataGridView的新行不是列表的一部分,而是“独立”的客户实例? 我本以为它们会自动添加到列表中。 删除的行也一样,我认为会自动从列表中删除,而ORM的SaveChanges方法可以选择它吗?

我应该做的不仅仅是绑定吗? 有没有人在这方面取得任何成功,总的来说,你的数据绑定使用WinForms的成功程度是多少,你选择的ORM(不一定是Telerik的)?

谢谢。

你怀疑是对的。 您将网格绑定到“独立”对象列表,并且每个对象都是自我跟踪,但列表不是。 这就是为什么对现有对象的更改按预期工作的原因,但添加/删除不会。

一种解决方案是使用可观察集合而不是标准列表。 然后,您可以处理相同的绑定,但可以根据需要通过在上下文中添加/删除项来响应添加/删除事件。

基本Ex:

  private PropertyManagerModel.DemoDBEntityDiagrams context; public Form1() { InitializeComponent(); context = new DemoDBEntityDiagrams(); LoadCommunities(); } private void LoadCommunities() { var communityList = new ObservableCollection(context.Communities); communityList.CollectionChanged += new NotifyCollectionChangedEventHandler(communityList_CollectionChanged); this.dataGridView1.DataSource = new BindingSource() { DataSource=communityList}; } void communityList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) context.Add(e.NewItems); if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove) context.Delete(e.OldItems); context.SaveChanges(); } 

据我所知,所有ORMS都是如此。 希望这可以帮助!

问候,

约书亚霍尔特