1

我有一个带有一组实体文本框的 winforms 应用程序,我们称之为实体Product

我的一个文本框是隐藏的,因为它拥有另一个数据库对象的外键Business Unit。我使用在父表上查找值的组合框填充隐藏的文本框。When the selection changes, so does the value in the hidden textbox.

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

        this.businessUnitComboBox.Focus();
    }

问题是在我的上下文中调用 SaveChanges 后,隐藏文本框上的这个更改没有保留。奇怪的是,如果我更新任何其他Product文本框,它们会保存得很好。

文本框通过 Visual Studio 的 GUI 的标准拖放添加到项目中,并且在自动添加时创建了绑定源。

我的实体使用 fody-propertychanged 实现 INotifyPropertyChanged。

我正在努力在这里找到问题。创建新记录工作正常,但更新一个外键值永远不会。

这是因为它是一个导航属性并且需要以不同的方式处理,还是有其他可能性来说明为什么不保留更改?任何帮助深表感谢。

4

1 回答 1

1

可能是因为您的 Save 方法中缺少 this.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.Validate在保存更改之前使用,您可以简单地使用

this.yourBindingSource.EndEdit();
yourDbContext.SaveChanges();
于 2015-08-24T22:01:03.217 回答