c#linq更新数据库中的所有记录

时间:2009-09-07 23:20:57

标签: c# database linq-to-sql records

我尝试使用以下代码更新sql表中的所有记录,但没有更新数据。有谁知道为什么?

        using (DataContext db = new DataContext())
        {
            foreach (Item record in db.Items)
            {
                record.Description += "bla";
                db.SubmitChanges();
            }
        }

setter的代码:

[Column(Storage="_Description", DbType="NVarChar(400) NOT NULL", CanBeNull=false)] 
public string Description
{ 
  get { return this._Description; }
  set { 
      if ((this._Description != value))
       { 
         this._Description = value; 
       }
      }
}

5 个答案:

答案 0 :(得分:4)

出于好奇,看看在循环之外移动SubmitChanges()是否有所作为:

        using (DataContext db = new DataContext())
        {
            foreach (Item record in db.Items)
            {
                record.Description += "bla";   
            }
            db.SubmitChanges();
        }

答案 1 :(得分:3)

根据您在评论中发布的setter的详细信息,尚未正确创建Description属性以通知属性更改。您是自己编写属性还是由VS2008工具生成?

您的Item类(所有Linq to Sql实体都应该实现INotifyPropertyChanging和INotifyPropertyChanged),这将为您提供PropertyChanging事件和PropertyChanged事件,如果您使用VS2008工具,您应该获得以下几种方法实体类:

    protected virtual void SendPropertyChanging(string propertyName)
    {
        if (this.PropertyChanging != null)
        {
            this.PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
        }
    }

    protected virtual void SendPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

现在,在您的属性的setter中,您应该使用这些方法来引发所需的事件:

[Column(Name="Description", Storage="_Description",
                  DbType="NVarChar(400) NOT NULL", CanBeNull=false)]   
public string Description
{
     get { return this._Description; }
     set
     {
         if ((this._Description != value))
         {
             this.SendPropertyChanging("Description");
             this._Description = value;
             this.SendPropertyChanged("Description");
         }
     }
 }

我还注意到你没有在你的列属性中设置Name属性,所以添加它以防万一(我的例子中包含它,假设你的列名是“描述”)。

答案 2 :(得分:2)

也许您需要提供连接字符串。

using (DataContext db = new DataContext(_MyConnectionString))
{
    foreach (Item record in db.Items)
    {
        record.Description += "bla";
    }
    db.SubmitChanges();
}

当没有提供连接字符串时,我对DataContext有一些奇怪的问题。

答案 3 :(得分:2)

我会指出你可以在循环关闭后提交SubmitChanges ......这不会解决你的问题,但它会有所帮助。

答案 4 :(得分:0)

我意识到这是一个非常老的问题,但仍然没有答案。

Simon Fox提供的答案在技术上是正确的,而BFree的建议可以节省大量时间。

但是,如果您的表没有在表中指定主键,则DBML对象将不会检测到更改,并且不知道如何更新记录。

screenshot