DbContext SaveChanges不可预测

时间:2014-06-14 12:27:22

标签: c# winforms entity-framework

我遇到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个月的值后,我按下了保存按钮并检查数据库中的值,但得到了一个非常奇怪的结果:它们总是不同意味着某些付款被更改而有些不是,但最后一个带有最低的日期总是改变......

我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

数据绑定的WinForms默认行为是在调用控件的Validate方法时更新绑定对象的属性。在某些情况下会自动调用它,这解释了为什么你会看到一些更新,但点击按钮不是其中一种情况。

最有可能的是,只要控件的编辑值发生更改,就更新绑定对象的属性将更适合您的需要。要做到这一点,请使用DataBindings.Add重载,以便指定DataSourceUpdateMode,例如this one,并确保通过DataSourceUpdateMode.OnPropertyChanged