1.EF在更新数据的时候报错,Bug复原:如果修改的时候不对任何数据进行修改,则报错,如果修改了某一个属性,则不报错,,报错内容如下图所示:
实现方法的代码封装如下:
大家谁遇到过这个问题,提供一下大家的思路,谢谢!~~~~~
有可能是else的判断逻辑有问题:
var modify = ctx.Entry(entity); if(isUpdate){ ctx.Set<T>().Attach(entity); modify.State = EntityState.Modified; } else{ propertiesToUpdate.ToList().ForEach(p => modify.Property(p).IsModified = true); }
下面的判断是指定修改固定字段的,如果改成这样会有问题~~~~~
@Kencery: 是修改指定字段,实体未在ef容器中跟踪需要将每个字段的IsModified属性设置为true,具体有什么问题呢?
@JoiWilliam: 上面我发的那个的最终结果是,如果设置为true,则更新我传递的字段不更新其它字段,如果传递false,则不更新后面的我指定的字段而更新其它数据库的字段,如果不传递指定的修改字段,则直接修改全部的数据库字段
@Kencery: isUpdate是用来标记使用propertiesToUpdate更新的吗?
应该Entity与Database结构不一致,可以尝试重新生成或更新。
更新请参见:https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html
数据库和实体结构绝对是一一对应的~
你的数据库带有版本字段,控制并发。
数据库是没有带的~
@Kencery: 你的错误提示表示update没有受影响的行数。不是版本字段就是id有问题。
@calvinK: 数据库没有加版本ID
@Kencery:
生成的update语句,条件数据库查不到数据。骚年。
if(propertiesToUpdate.Length==0)
{
return await Task.Run(()=>false);
}
既然不修改就会报错,那不修改的时候啥都不做不就完事了!
但是修改实体传递了,是不会走这一步。。。。
@Kencery: 那你在加一个参数叫isEntityUpdate
if(propertiesToUpdate.Length==0)
{
if(isEntityUpdate)
{
cxt.Set<T>().Update(entity);
}
}
我还是建议不要封装ef...除了多敲代码.让结构僵化,没有任何意义
你这个问题在错误提示里面不是让你去看一个连接.
错误提示看着像是配置下就能解决的问题.