我对 ORM 还很陌生,目前我正在尝试 Telerik OpenAccess ORM,但问题实际上可能并不特定于该 ORM,而且我还没有完全确定该 ORM。
我想要实现的是绑定 DataGridView 以显示 Customers 对象的集合,其中显示客户表中的所有客户。
我已将其绑定到 BindingSource 并将 BindingSource 绑定到 DataGridView 控件。
我可以成功修改现有项目(使用 OpenAccess ORM 的 SaveChanges 方法)。当我保存时,内容会按我的预期保存回数据库中。
但是,如果我从 DataGridView 中删除一行或添加新行,它们不会保存到数据库中,也不会出现任何错误消息或异常。
理想情况下,我希望能够使用 ORM 执行所有可能的 CRUD 操作,就像我能够使用典型的 DataTable 执行此操作一样......
执行绑定的代码如下所示:
List<Customer> 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 的)有多成功?
Thanks.
你的怀疑是正确的。您将网格绑定到“独立”对象列表,虽然每个对象都是自跟踪的,但该列表不是。这就是为什么对现有对象的更改可以按预期工作,但添加/删除却不能。
一种解决方案是使用可观察集合而不是标准列表。然后,您可以以相同的方式处理绑定,但通过根据需要从上下文中添加/删除项目来响应添加/删除事件。
基本例:
private PropertyManagerModel.DemoDBEntityDiagrams context;
public Form1()
{
InitializeComponent();
context = new DemoDBEntityDiagrams();
LoadCommunities();
}
private void LoadCommunities()
{
var communityList = new ObservableCollection<Community>(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 都是如此。希望这可以帮助!
Regards,
约书亚·霍尔特
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)