我遇到DbContext SaveChanges()方法的问题,有时可以保存,有时也不会。 在我的WinForm应用程序中,我有12个numericUpDown控件,它们代表12个月前的值。
numericUpDown名称存储在字符串列表中:
List<string> controlNames = new List<string>();
controlNames.Add("firstMonthNumericUpDown");
controlNames.Add("secondMonthNumericUpDown");
controlNames.Add("thirdMonthNumericUpDown");
controlNames.Add("fourthMonthNumericUpDown");
controlNames.Add("fifthMonthNumericUpDown");
controlNames.Add("sixthMonthNumericUpDown");
controlNames.Add("seventhMonthNumericUpDown");
controlNames.Add("eighthMonthNumericUpDown");
controlNames.Add("ninthMonthNumericUpDown");
controlNames.Add("tenthMonthNumericUpDown");
controlNames.Add("eleventhMonthNumericUpDown");
controlNames.Add("twelfthMonthNumericUpDown");
在表单构造函数中,我将此控件绑定到来自我的DbContext的Payment对象的CalculatedSalary属性:
DateTime loopDate = new DateTime();
for (int monthBack = 1; monthBack <= 12; monthBack++)
{
//BINDING PREVIOUS PAYMENTS SALARY
loopDate = currentPayment.Month.AddMonths(-monthBack);
NumericUpDown loopNumericUpDown = this.Controls.Find(controlNames[monthBack-1], true).First() as NumericUpDown;
Payment loopMonthPayment = payment.Person.Payments.Where(p=>p.Month.Year == loopDate.Year && p.Month.Month == loopDate.Month).FirstOrDefault();
if (loopMonthPayment == null)
{
//PERSON'S PAYMENT FOR THAT MONTH WAS NOT CREATED BEFORE
loopMonthPayment = new Payment(loopDate);
payment.Person.Payments.Add(loopMonthPayment);
}
//BIND PERSON'S PAYMENT FOR LOOPED MONTH TO LOOPED NUMERICUPDOWN CONTROL
loopNumericUpDown.DataBindings.Add("Value", loopMonthPayment, "CalculatedSalary");
}
点击保存按钮:
Form1.entities.SaveChanges();
在numericUpDown中更改了所有12个月的值后,我按下了保存按钮并检查数据库中的值,但得到了一个非常奇怪的结果:它们总是不同意味着某些付款被更改而有些不是,但最后一个带有最低的日期总是改变......
我的代码有什么问题?
答案 0 :(得分:1)
数据绑定的WinForms默认行为是在调用控件的Validate
方法时更新绑定对象的属性。在某些情况下会自动调用它,这解释了为什么你会看到一些更新,但点击按钮不是其中一种情况。
最有可能的是,只要控件的编辑值发生更改,就更新绑定对象的属性将更适合您的需要。要做到这一点,请使用DataBindings.Add
重载,以便指定DataSourceUpdateMode
,例如this one,并确保通过DataSourceUpdateMode.OnPropertyChanged
。