linq 实体框架更新未更新数据库表

hgncfbus  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(111)

我有代码,我认为是为实体框架更新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

  1. 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”。

nnt7mjpx

nnt7mjpx1#

就目前而言,您的代码现在说“从数据库中取出这个东西,然后保存我刚才所做的任何更改”,但它实际上从未更改您从数据库中取出的东西。
问题很可能是在注解掉对TryUpdateModel()的调用时出现的,ASP.NETMVC使用TryUpdateModel()根据传递到HTTP请求中的参数对给定对象进行修改。
我强烈建议使用版本控制系统,以便更容易地查看您在任何给定时间点更改的内容,并撤消您错误更改的内容。

ghhkc1vu

ghhkc1vu2#

如果您查看DbContext.SaveChanges的文档,您会看到它提到以下内容...
将在此上下文中所做的所有更改保存到基础数据库。
由于您没有做任何更改(在显示的代码中),因此预期的结果正在发生。
此外,API public virtual int SaveChanges()建议您可以从SaveChanges获取更新的记录数,例如。

var recordsUpdated = db.SaveChanges();
e1xvtsh3

e1xvtsh33#

在您发布的代码中,没有对任何数据进行更改。Entity Framework正确地确定了这一点,并且不发出任何更新语句。
看起来是TryUpdateModel调用进行了更改,但如果不查看它的代码,我无法判断。由于此调用已注解掉,因此更改不会发生。

tcbh2hod

tcbh2hod4#

在我的例子中,它是表模型中缺少主键。在为ID列显式指定[Key]属性之后,数据库中的值开始更新

[Key]
[Column("ID", TypeName = "NUMBER")]
public decimal Id { get; set; }

相关问题