Winforms 数据绑定文本框更新不会持久保存到数据库

Winforms 数据绑定文本框更新不会持久保存到数据库,winforms,entity-framework,bindingsource,fody-propertychanged,Winforms,Entity Framework,Bindingsource,Fody Propertychanged,我有一个winforms应用程序,其中包含一组用于实体的文本框,我们将该实体称为Product 我的一个文本框是隐藏的,因为它持有另一个数据库对象的外键业务单元。我使用在父表中查找值的组合框填充隐藏的文本框。当选择更改时,隐藏文本框中的值也会更改 private void businessUnitComboBox_SelectionChangeCommitted(object sender, EventArgs e) { this.businessUnitIdTextBo

我有一个winforms应用程序,其中包含一组用于实体的文本框,我们将该实体称为
Product

我的一个文本框是隐藏的,因为它持有另一个数据库对象的外键
业务单元
。我使用在父表中查找值的组合框填充隐藏的文本框。当选择更改时,隐藏文本框中的值也会更改

private void businessUnitComboBox_SelectionChangeCommitted(object sender, EventArgs e)
    {
        this.businessUnitIdTextBox.Text = this.businessUnitComboBox.SelectedValue.ToString();

        this.businessUnitComboBox.Focus();
    }
问题是在我的上下文中调用SaveChanges后,隐藏文本框中的此更改不会持久化。奇怪的是,如果我更新任何一个
产品
文本框,它们都可以保存

文本框是通过VisualStudio的GUI中的标准拖放添加到项目中的,并且在自动添加时创建了bindingsource

我的实体使用fody propertychanged实现INotifyPropertyChanged

我正在努力寻找这个问题。创建新记录可以很好地工作,但是更新一个外键值从来没有


这是因为它是一个导航属性,需要以不同的方式处理,还是有其他可能导致更改无法持久化?非常感谢您的帮助。

可能是因为您的保存方法中缺少此.Validate()。 将此代码放入表单的保存方法中

this.Validate();
this.yourBindingSource.EndEdit();
yourDbContext.SaveChanges();
数据绑定的默认行为是OnValidation

要更改此行为,可以转到文本框属性,打开数据绑定部分,打开高级,将数据源更新模式更改为OnPropertyChanged

因此,在设计器生成的代码中进行数据绑定的代码如下所示:

this.nameTextBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.productBindingSource, "Category.Name", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
在这种情况下,您不需要使用
此选项。保存更改前验证
,您只需使用

this.yourBindingSource.EndEdit();
yourDbContext.SaveChanges();

我们可以查看您的产品模型类吗?我可以解决直接分配给外键对象而不是外键Id的问题。
产品
类是POCO,包括fody INotifyPropertyChanged magic。但我确实使用演示者作为形式和上下文之间的中介。我现在将
BusinessUnitBindingSource.Current
传递给演示者,并设置导航属性而不是Id。感谢您对DataSourceMode的建议和解释。我不熟悉这个框架,不知道这些配置。不幸的是,添加这些行并没有改变我的情况。我能够解决直接分配给外键对象而不是外键Id的问题。因此我使用
Product.BusinessUnit=BusinessUnitBindingSource.Current
而不是
Product.BusinessUnitId=(int)this.businessUnitIdTextBox.Text