ORM,将数据绑定到DataGridView:插入/删除的新行未保存到数据库

3

我对ORM还比较新,目前正在尝试使用Telerik OpenAccess ORM,但问题可能并不特定于该ORM,而且我还没有完全确定使用哪个ORM。

我的目标是将DataGridView绑定到显示Customer对象集合的所有客户的客户表。

我已经将其绑定到BindingSource,并将BindingSource绑定到DataGridView控件。

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

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

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

执行绑定的代码如下:

        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的ORM)?
谢谢。
1个回答

3

你的怀疑是正确的。你将表格绑定到一个“独立的”对象列表上,虽然每个对象都是自我跟踪的,但列表却不是。这就是为什么对现有对象的更改按预期工作,但添加/删除不起作用的原因。

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

基本示例:

  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();
    }      

据我所知,所有ORM都将是这种情况。希望这能有所帮助!
祝好,
Joshua Holt

当DataGridView上有组合框时,它无法正常工作。在这些情况下,ObservableCollection会持续触发,导致DataError异常。 - sentenza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接