使用Linq To Sql Classes
不要更新上下文中的对象。
我正在使用Context获取一些记录并更新它们。
在我的数据库中,我有一条记录需要更新...
我得到它并更新了一个字段,但上下文中的对象不会改变。怎么可能? 我的代码如下:
using(myPersonalModelContext ctx = new myContext())
{
List<LogIn> notProcessedLogins = ctx.LogIns.Where(login => login.processed == false).ToList(); //Returns 1 record. Ok.
foreach (LogIn notProcessedLogin in notProcessedLogins)
{
notProcessedLogin.processed = true;
}
int notProcessedLoginsCounter = ctx.LogIns.Where(login => login.processed == false).Count(); //Returns 1!!!
ctx.SubmitChanges(); //The object in the context has no change, so it doesn't update nothing.
int notProcessedLoginsCounter = ctx.LogIns.Where(login => login.processed == false).Count(); //Returns 1!!!
}
我正在关注documentation example,看起来很琐碎,所以我不明白。有什么想法吗?
在自动生成的文件中,我看到正在正确更新_processed
:
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_processed", DbType="Bit")]
public System.Nullable<bool> processed
{
get
{
return this._processed;
}
set
{
if ((this._processed != value))
{
this._processed = value;
}
}
}
我的印象是,我正在更新的对象由于某种原因与上下文分离。
答案 0 :(得分:-2)
我知道原因。
当您调用ToList()时,它实际上会创建一个副本,因此您无需更改原始值。
尝试:
using(myPersonalModelContext ctx = new myContext())
{
var notProcessedLogins = ctx.LogIns.Where(login => login.processed == false);
foreach (LogIn notProcessedLogin in notProcessedLogins)
{
notProcessedLogin.processed = true;
}
int notProcessedLoginsCounter = ctx.LogIns.Where(login => login.processed == false).Count();
ctx.SubmitChanges();
int notProcessedLoginsCounter = ctx.LogIns.Where(login => login.processed == false).Count();
}