为什么数据库没有更新?

时间:2012-10-09 18:04:30

标签: c# asp.net-mvc linq-to-entities

我有以下代码:

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(); } }

数据库添加一个新条目就好了,但没有更新它。我错过了什么?感谢。

3 个答案:

答案 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;