我正在使用自定义存储过程从我的数据库中检索数据:
tbTextBox.Text = db.getSettingValue("PropertyName").First().Value;
(db是一个全局DataClasses
对象,在FormLoad
事件中初始化)
这部分完全正常,它在循环中重复(定时器间隔30秒)
如果用户更改了文本框的值,则会触发以下代码:
private void tbTextBox_TextChanged(object sender, EventArgs e)
{
if (tbTextBox.Text != db.getSettingValue("PropertyName").First().Value)
{
db.Settings.Where(n => n.Name == "PropertyName").First().Value = tbTextBox.Text;
db.SubmitChanges();
}
}
如果我在submitChanges
之前创建对象并更改其值 - 结果相同。我正在调试它并不喜欢它永远不会通过我的IF语句;)
为什么不工作?没有例外......如果我使用SQL Server Management Studio查询“设置”表,则数据库中没有任何更改。
EDIT1:
db.Settings.Where(n => n.Name == "AvailablePeriods").First().Value = tbPeriods.Text;
var a = db.Settings.Where(n => n.Name == "AvailablePeriods");
var b = a.First();
var c = b.Value;
b.Value = tbPeriods.Text;
var d = db.GetChangeSet();
db.SubmitChanges();
我已将代码分成较小的步骤以便正确调试。一切正常,但...... Changeset不返回任何更新。对于下一步,我将尝试按照建议使用“附加”。
EDIT2: 添加PK解决了这个问题。现在一切都像魅力一样。
经验教训 - 我不应该太相信自己:)
答案 0 :(得分:3)
直接更新数据上下文的数据不是更新表的方法。如果数据已存在,请使用Attach Method;如果数据不存在,则使用InsertOnSumit
答案 1 :(得分:1)
此记录:
db.getSettingValue("PropertyName").First()
可能与此记录不同:
db.Settings.Where(n => n.Name == "PropertyName").First()
您在没有指定订单的情况下调用First - 因此数据库可以选择,而且不必一致地选择。
您应该在一行中执行更少操作,以便在逐步执行代码时获得更多信息。
它在循环中重复(定时器间隔30秒)
这是在另一个线程上吗? tbTextBox.Text的值是否在执行if-criteria和if-block之间发生变化?