1

我有一个实体的一组文本框WinForms应用程序,让我们称之为实体Product数据绑定文本框更新不会坚持到DB

我的一个文本框被隐藏,因为它拥有一个外键到另一个数据库对象Business Unit。我使用查找父表上的值的组合框填充隐藏的文本框。当选择更改时,隐藏文本框中的值也会更改。

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。

我很努力地在这里找到问题。创建新的记录工作正常,但更新一个外键值从来没有。

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

+0

我们可以看到您的产品模型类吗? – samiz

+0

我能够解决直接分配给外键对象而不是外键ID的问题。 “Product”类是包含fody-INotifyPropertyChanged魔术的POCO。但我确实使用Presenter作为表单和上下文之间的中介。我现在将'BusinessUnitBindingSource.Current'传递给演示者并设置导航属性而不是Id。 – wesmantooth

回答

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(); 
+0

感谢您对DataSourceMode的建议和解释。我对这个框架很陌生,并没有意识到这些配置。不幸的是,添加这些行并没有改变我的情况。我能够解决直接分配给外键对象而不是外键ID的这个问题。所以我使用'Product.BusinessUnit = BusinessUnitBindingSource.Current'而不是'Product.BusinessUnitId =(int)this.businessUnitIdTextBox.Text' – wesmantooth