Linq to sql 当我更改属性的值时,Linq2Sql会创建一个额外的实例-为什么?

Linq to sql 当我更改属性的值时,Linq2Sql会创建一个额外的实例-为什么?,linq-to-sql,Linq To Sql,我有一个名为UserProperties的表。每个用户都有一小组用户属性。我将它们加载到程序中一个名为\u userProperties的字典中(以便将它们兑现) 基本上,该表如下所示: 列CreatedOn、ModifiedOn、CreatedBy和ModifiedBy不是DAL(dbml)的一部分,因为它们严格用于调试目的。触发器设置ModifiedBy和ModifiedOn 当用户想要保存其设置(或程序认为应该保存)时,我调用以下代码: string userPropertyValue

我有一个名为UserProperties的表。每个用户都有一小组用户属性。我将它们加载到程序中一个名为\u 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)时,再次调用构造函数,这会创建第二个实例,这让我感到困惑

不会引发异常,并将额外实例保存到表中(这会导致错误,因为额外实例包含更改propertyvalue,下次通过id较小的行(旧的行)从数据库读取旧值时)

调用堆栈如下所示(我在构造函数中放置了一个断点,并在(2)之后捕获了screendumb:

有人能告诉我为什么WPF会这样做,以及我是如何让它停止的吗?

Windows:Windows 7终极64位
Visual Studio:Visual Studio 2010 Ultimate

您的Linq to SQL代码似乎有点不合常规,因此我在下面提供了以下替代代码。请注意使用DataContext成员变量、构造函数和带有空检查的
FirstOrDefault
,而不是
First()
。如果函数成功,则返回
true
;如果函数未成功,则返回
false
。尽管Linq DataContext实现了
Dispose
,但最好将其放在范围之外(您可以在Internet上的其他地方找到相关文档)


fk_Employee(ASC)、PropertyName(ASC)、IsDeleted(DESC)上有一个聚集索引。而(当然)id是主键。一个明显的解决方法是设置
\u UserProperties[UserPropertyKey]=userPropertyValueAsString
。我需要将数据保存到数据库中。该语句只会更改已兑现的数据(字典)。实际上,我是在(2)changedUserProperty.PropertyValue=userPropertyValueAsString之后的语句中这样做的。将把数据保存到数据库中。
\u UserProperties[UserPropertyKey]=userPropertyValueAsString
将把数据保存到缓存中。我看不到你的观点。关于保存到数据库的内容和保存到缓存的内容,你是正确的。我两者都需要-但是保存到数据库会给我一个UserProperty的额外副本,这是我的问题。不保存到数据库并不能解决我的问题(这就是我理解您的解决方案的方式)
public class UserSettings
{
     DataAccessDataContext dc;
     bool result = false;
     string[] _userProperties;

     public Settings(JSApplication application, string[] userProperties)
     {
         dataContext = CreateContext(application.CommitDal));
         _userProperties = userProperties;
     }

     public bool SaveUserSettings(string key, string settings)
     { 
         var property = dc.UserProperties.FirstOrDefault(u => u.fk_Employee == employeeId && u.PropertyName == userPropertyKey);
         if (property != null)
         {
              property.Value = settings;
              _userProperties[key] = settings;
              result = dc.SubmitChanges();
         }
         return result;
     }
}