我有一个名为 UserProperties 的表。每个用户都有一小组用户属性。我将它们加载到程序中,放入名为_userProperties的字典中(以便兑现)。
基本上该表如下所示:
列:CreatedOn、ModifiedOn、CreatedBy 和 ModifiedBy 不是 DAL (dbml) 的一部分,因为它们严格用于调试目的。触发器设置 ModifiedBy 和 ModifiedOn。
当用户想要保存他的设置(或者程序认为他们应该被保存)我调用这个代码:
string userPropertyValueAsString = (String)Convert.ChangeType(userPropertyValue, typeof(String));
if (_userProperties.ContainsKey(userPropertyKey))
{
if (_userProperties[userPropertyKey] != userPropertyValueAsString)
{
using (DataAccessDataContext dataContext = CreateContext(JsApplication.CommitDal))
{
(1) UserProperty changedUserProperty = dataContext.UserProperties.First(u => u.fk_Employee == employeeId && u.PropertyName == userPropertyKey);
(2) changedUserProperty.PropertyValue = userPropertyValueAsString;
_userProperties[userPropertyKey] = changedUserProperty.PropertyValue;
if (!dataContext.SubmitChanges())
{
throw new SubmitChangesException(employeeId);
}
}
}
}
当我到达(1)时,类 UserProperty 的构造函数被调用(正如预期的那样,因为在数据库的表中找到了 UserProperty)。但是当我到达(2)时,再次调用构造函数,它创建了第二个实例,这让我感到困惑。
不会抛出异常并且额外的实例被保存到表中(这会导致错误,因为额外的实例包含更改属性值,并且下次通过具有较小 id 的行(旧的)从数据库中读取旧值时)。
调用堆栈看起来像这样(我在构造函数中放置了一个断点,并在 (2) 之后立即捕获了 screendumb:
谁能告诉我为什么WPF会这样做以及我如何让它停止?
Windows:Windows 7 Ultimate 64 位 Visual Studio:Visual Studio 2010 Ultimate