我有以下代码:
model = new Option();
model.val1 = newVal1;
model.val2 = newVal2;
model.val3 = newVal3;
//this saves new record just fine
if (recordCount < 1)
{
context.Options.AddObject(model);
context.SaveChanges();
}
else
{
var tempID = from s in context.Options where (s.val1 == newVal1 && s.val2 == newVal2) select s.ID;
var resultsID = tempID.First();
model = context.Options.Single(m => m.ID == resultsID);
if (TryUpdateModel(model, new[] { "val3" }))
{
//this isn't updating the record
context.SaveChanges();
}
}
model = new Option();
model.val1 = newVal1;
model.val2 = newVal2;
model.val3 = newVal3;
//this saves new record just fine
if (recordCount < 1)
{
context.Options.AddObject(model);
context.SaveChanges();
}
else
{
var tempID = from s in context.Options where (s.val1 == newVal1 && s.val2 == newVal2) select s.ID;
var resultsID = tempID.First();
model = context.Options.Single(m => m.ID == resultsID);
if (TryUpdateModel(model, new[] { "val3" }))
{
//this isn't updating the record
context.SaveChanges();
}
}
数据库添加一个新条目就好了,但没有更新它。我错过了什么?感谢。
答案 0 :(得分:2)
查看此代码,首先创建一个新模型并在其上设置一些属性:
model = new Option(); // <- A
model.val1 = newVal1;
model.val2 = newVal2;
model.val3 = newVal3;
然后,假设您正沿着“其他”路径前进,那么您可以这样做:
var tempID = from s in context.Options where (s.val1 == newVal1 && s.val2 == newVal2) select s.ID;
var resultsID = tempID.First();
model = context.Options.Single(m => m.ID == resultsID); // <- B
if (TryUpdateModel(model, new[] { "val3" }))
{
//this isn't updating the record
context.SaveChanges();
}
,它会在context.Options
中找到具有匹配ID的条目。
所以,现在你通过model
电话(我用评论“A”标记)创建的new()
现在已经被抛弃并且你有一个不同的 - 通过调用context.Options.Single()
检索到的那个,我用注释“B”标记。它具有基于上下文中的内容的属性,而不是您所创建的对象中的内容。那个物体现在已经消失了。你有一个从DB中检索到的新对象B.
现在,你在这个检索到的对象上调用TryUpdateModel,告诉它val3已更新,但值没有改变,对吧?这是你从上下文中提取的任何东西。
所以,它不会更新任何东西,因为模型对象不是你认为的那个......你更新的那个等待垃圾收集。您检索到的那个尚未更新,因为它仍然具有属性val3
的任何值。
假设我遵循您在此处尝试做的事情,那就是您在上下文中没有看到任何更新值的原因。
如果要更改已检索的val3
对象上model
属性的值,则需要在检索后设置它,否则会被覆盖。
答案 1 :(得分:0)
如果您使用全局上下文,则必须更新上下文本身,因为它不是数据库的软链接。
context.SaveChanges();
DbContext context = new DbContext();
答案 2 :(得分:0)
检查是否Configuration.AutoDetectChangesEnabled = true
;