我有我认为正在为Entity Framework更新sql server表工作的代码。单步执行代码时,我不会收到错误。
var newsToUpdate = db.tblTips.Find(id);
//if(TryUpdateModel(newsToUpdate, "",))
try
{
db.SaveChanges();
}
catch (RetryLimitExceededException)
{
ModelState.AddModelError("", "unable to save changes");
}
if(TryUpdateModel(...
行,如果我在数据库表DID中的记录更新时使用了该行,我就不记得。id
如果不更新记录,我该如何理解C#visual studio中的原因?没有错误。
更新:
我的模型是tblTips,我方法上的签名是
public ActionResult AddNews(tblTips tips, int? groupid, int? id)
似乎更新页面不知道其他列,并尝试将其尝试将列更新的所有列更新为null,其中db表中该列为" not null&#34 ;
好吗"好的" (是的,我知道我应该使用viewmodel)来执行以下操作以从更新中排除列?
db.Entry(tips).State = EntityState.Modified;
db.Entry(tips).Property(x => x.createdby).IsModified = false;
db.SaveChanges();
我想我不应该相信我在Stackoverflow上读到的所有内容,上面用
失败了附加类型' BRM.Data.Models.tblTips'的实体。失败是因为 另一个相同类型的实体已经拥有相同的主键 值。使用'附加'方法或设置 一个实体的状态为“未变”'或者'修改'如果有任何实体 图表具有冲突的键值。这可能是因为某些实体 是新的,尚未收到数据库生成的键值。在 这种情况使用'添加'方法或“添加”#39;实体状态跟踪 图表然后将非新实体的状态设置为“未更改”。要么 '变形'酌情。
答案 0 :(得分:2)
现在,您的代码现在说“将这个东西从数据库中取出,然后保存我刚才所做的任何更改”,但它实际上从未真正改变您从数据库中获取的内容。
当您注释掉TryUpdateModel()
的调用时,很可能出现了问题,ASP.NET MVC使用该调用根据传递给HTTP请求的参数对给定对象进行修改。
我强烈建议您使用版本控制系统,以便更轻松地查看您在任何指定时间点更改的内容,并撤消错误更改的内容。
答案 1 :(得分:1)
如果您查看DbContext.SaveChanges的文档,您会看到它提到以下内容......
将在此上下文中所做的所有更改保存到基础数据库。
由于您未进行任何更改(在显示的代码中),因此预期结果正在发生。
另外,api public virtual int SaveChanges()
建议您可以从SaveChanges
获取更新的记录数,例如
var recordsUpdated = db.SaveChanges();
答案 2 :(得分:0)
在您发布的代码中,没有对任何数据进行任何更改。实体框架正确地确定了这一点,并且没有发出任何更新语句。
看来TryUpdateModel
调用是进行更改的内容,但是如果不查看代码,我就无法判断。由于此调用已被注释掉,因此不会发生更改。