我尝试使用以下代码更新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;
}
}
}
答案 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)