本文将很容易解决的问题搞复杂了,多数情况下将MySql连接字符串中的Use Affected Rows参数设置为true即可。
2012-06-17 作者注。
在使用MySQL数据库来做为Entity Framework的Provider时,有时会遇到如下问题:
存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项。
问题产生的场景可能为:
通常会遇到这样的问题,我们打开编辑界面,然后不更改任何内容,然后点保存,基本流程为
1: var detail=db.Table.FirstOrDefault(c=>c.id==1);
2: detail.Content=model.Content;
3: db.SaveChanges();
因为我们没有更改任何内容,所以更改前与更改后的内容是一致的,这时会报出以上错误
其原因是因为MySQL与SQLServer的处理机制不同,如果更新内容与数据库的一致,SQLServer仍然会返回受影响行数为1,但是MySQL则会认为受影响行数为0。
而Entity Framework应该是默认以SQLServer的为准,所以认为如果更新了,但是返回受影响条数为0,则认为是更新不正确
我们处理这个问题有很多方法 ,最笨的应该是在赋值前进行判断,detail.Content是否与model.Content相等,如果相等就不进行赋值。
不过因为EntityFramework是在我们对属性赋值时更新了此属性的State使之标识为Modified或Deleted等 状态,