通过右击Controller生成的修改代码,在前台使用修改功能时可以正常修改数据,但是为什么我自己从数据库读取一个对象,然后把对象中的某个值修改了,再提交到EF中去,结果还是原来的数据,代码如下:
public int Modify(T model, params string[] proNames) { //4.1将 对象 添加到 EF中 DbEntityEntry entry = db.Entry<T>(model); //4.2先设置 对象的包装 状态为 Unchanged entry.State = System.Data.EntityState.Unchanged; //4.3循环 被修改的属性名 数组 if (proNames.Length > 0) { foreach (string proName in proNames) { //4.4将每个 被修改的属性的状态 设置为已修改状态;后面生成update语句时,就只为已修改的属性 更新 entry.Property(proName).IsModified = true; } } else { entry.State = System.Data.EntityState.Modified; } //4.4一次性 生成sql语句到数据库执行 return db.SaveChanges(); }
无论是设置了proNames还是没有设置,结果都一样,加断点后发现上面代码的model的确改变了,不知道为什么结果还是原来的数据,在SQLProfiler中得到SQl语句就是更新数据为数据库中数据而不是新的数据,求高手指导还有什么问题?
用db.Set<T>().Attach(model)试试
在第二行加上可以了,谢谢Dudu。我还想知道第一段代码不是已经将对象添加到EF中,而且在Edit.cshtml修改数据没有问题。通过加断点发现代码中的model,在使用edit.cshtml修改时是实体本身,而自己手动读取的时是实体代理类,是这个问题产生的吗?
@happydaily: 不仅要将对象添加到EF,还要让EF跟踪这个对象的状态变化