我有代码,我认为是为实体框架更新SQL服务器表工作。我在单步执行代码时没有得到错误。
var newsToUpdate = db.tblTips.Find(id);
//if(TryUpdateModel(newsToUpdate, "",))
try
{
db.SaveChanges();
}
catch (RetryLimitExceededException)
{
ModelState.AddModelError("", "unable to save changes");
}
1.注意,我有一行if(TryUpdateModel(...
,我不记得在数据库表中的记录更新时是否使用过它。
1.我可以看到模特的id
- DB表未更新。
我能做些什么来弄清楚为什么在C# Visual Studio中不更新记录?不存在错误。
更新:
我的模型是tblTips,我的方法上的签名是
public ActionResult AddNews(tblTips tips, int? groupid, int? id)
更新页面似乎不知道其他列,而是试图更新所有的列,它试图将一个列更新为null,而在db表中该列是一个“非null”
是否“确定”(是的,是的,我知道我应该使用视图模型)执行以下操作以从更新中排除列?
db.Entry(tips).State = EntityState.Modified;
db.Entry(tips).Property(x => x.createdby).IsModified = false;
db.SaveChanges();
我想我不应该相信我在Stackoverflow上读到的一切,上面失败了
附加类型为“BRM.Data.Models.tblTips”的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体的状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为一些实体是新的,并且尚未接收到数据库生成的键值。在这种情况下,使用“Add”方法或“Added”实体状态来跟踪图形,然后将非新实体的状态适当地设置为“Unchanged”或“Modified”。
4条答案
按热度按时间nnt7mjpx1#
就目前而言,您的代码现在说“从数据库中取出这个东西,然后保存我刚才所做的任何更改”,但它实际上从未更改您从数据库中取出的东西。
问题很可能是在注解掉对
TryUpdateModel()
的调用时出现的,ASP.NETMVC使用TryUpdateModel()
根据传递到HTTP请求中的参数对给定对象进行修改。我强烈建议使用版本控制系统,以便更容易地查看您在任何给定时间点更改的内容,并撤消您错误更改的内容。
ghhkc1vu2#
如果您查看DbContext.SaveChanges的文档,您会看到它提到以下内容...
将在此上下文中所做的所有更改保存到基础数据库。
由于您没有做任何更改(在显示的代码中),因此预期的结果正在发生。
此外,API
public virtual int SaveChanges()
建议您可以从SaveChanges
获取更新的记录数,例如。e1xvtsh33#
在您发布的代码中,没有对任何数据进行更改。Entity Framework正确地确定了这一点,并且不发出任何更新语句。
看起来是
TryUpdateModel
调用进行了更改,但如果不查看它的代码,我无法判断。由于此调用已注解掉,因此更改不会发生。tcbh2hod4#
在我的例子中,它是表模型中缺少主键。在为ID列显式指定[Key]属性之后,数据库中的值开始更新