LINQ提交更改未提交更改

时间:2008-09-30 22:50:27

标签: linq linq-to-sql

我正在使用LINQ to SQL和C#。我有两个LINQ类:用户和网络。

用户具有UserID(主键)和NetworkID

网络具有NetworkID(主键)和AdminID(用户ID)

以下代码可以正常使用:

user.Network.AdminID = 0;
db.SubmitChanges();

但是,如果我在进行更改之前访问AdminID,则更改永远不会发生在DB上。所以以下内容不起作用:

if(user.Network.AdminID == user.UserID)
{
     user.Network.AdminID = 0;
     db.SubmitChanges();
}

将它变成if语句并调用submit更改。出于某种原因,对AdminID的更改永远不会进入数据库。没有错误抛出,改变永远不会“花费”。

知道可能导致这种情况的原因吗?

感谢。

3 个答案:

答案 0 :(得分:2)

我刚刚进行了快速测试,它对我来说很好。

我不想问这个问题,但你确定if语句会返回true吗?可能你只是没有点击改变价值的代码。

除此之外,我们可能需要更多信息。该成员的财产是什么?您是否已跟踪到set语句以确保在调用SubmitChanges之前设置了值?在SubmitChanges之后,Linq实体是否具有新值?或者数据库和Linq实体都无法获取新值?

简而言之,该代码应该可以工作......所以其他地方可能是错误的。

答案 1 :(得分:0)

这是原始post


这是LinqToSql设计者生成的setter。

代码段

{
  Contact previousValue = this._Contact.Entity;
  if (((previousValue != value)
    || (this._Contact.HasLoadedOrAssignedValue == false)))
  {
    this.SendPropertyChanging();
    if ((previousValue != null))
    {
      this._Contact.Entity = null;
      previousValue.ContactEvents.Remove(this);
    }
    this._Contact.Entity = value;
    if ((value != null))
    {
      value.ContactEvents.Add(this);
      this._ContactID = value.ID;
    }
    else
    {
      this._ContactID = default(int);
    }
    this.SendPropertyChanged("Contact");
  }
}

此行将子属性设置为父级。

this._Contact.Entity = value;

此行将孩子添加到父母的集合

value.ContactEvents.Add(this);

ID的 setter 没有第二行。

所以,使用自动生成的实体...... 此代码产生意外行为:

myContactEvent.ContactID = myContact.ID;

这段代码很好:

myContactEvent.Contact = myContact;

此代码也很好:

myContact.ContactEvents.Add(myContactEvent);

答案 2 :(得分:0)

我有这个问题。原因是一行愚蠢的代码:

DBDataContext db { get { return new DBDataContext(); } }
显然它应该是:

DBDataContext db = new DBDataContext();