1

我有以下代码:

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

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

4

3 回答 3

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,您通过new()调用创建的 (我已用注释“A”标记)现在被抛在了一边,而您得到了另一个 - 您通过调用 检索到的那个context.Options.Single(),我已经标有注释“B”。它的属性基于上下文中的内容,而不是您制作的对象中的内容。那个 A 对象现在消失了。您已经从数据库中检索到了一个新对象 B。

所以现在,您在这个检索到的对象上调用 TryUpdateModel,告诉它 val3 已更新,但值没有改变,对吧?这是您从上下文中提取的任何内容。

所以,它不会更新任何东西,因为模型对象不是你认为的那个......你更新的那个正在等待被垃圾收集。您检索的那个尚未更新,因为它仍然具有该属性的任何值val3

假设我遵循您在此处尝试执行的操作,这就是您在上下文中看不到任何更新值的原因。

如果要更改已检索到的val3该对象的属性值,则model需要在检索后对其进行设置,否则将被覆盖。

于 2012-10-09T19:15:15.867 回答
0

如果您使用的是全局上下文,则必须更新上下文本身,因为它不是到数据库的软链接。

 context.SaveChanges();
 DbContext context = new DbContext();
于 2012-10-09T18:19:20.067 回答
0

检查是否Configuration.AutoDetectChangesEnabled = true

于 2012-10-09T18:25:01.753 回答