日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Entity Framework with MySQL Provider 更新行数为0的Bug

發(fā)布時(shí)間:2024/4/11 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Entity Framework with MySQL Provider 更新行数为0的Bug 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文將很容易解決的問題搞復(fù)雜了,多數(shù)情況下將MySql連接字符串中的Use Affected Rows參數(shù)設(shè)置為true即可。

2012-06-17 作者注。

?

在使用MySQL數(shù)據(jù)庫來做為Entity Framework的Provider時(shí),有時(shí)會(huì)遇到如下問題:

存儲(chǔ)區(qū)更新、插入或刪除語句影響到了意外的行數(shù)(0)。實(shí)體在加載后可能被修改或刪除。刷新 ObjectStateManager 項(xiàng)。

問題產(chǎn)生的場(chǎng)景可能為:

通常會(huì)遇到這樣的問題,我們打開編輯界面,然后不更改任何內(nèi)容,然后點(diǎn)保存,基本流程為

1: var detail=db.Table.FirstOrDefault(c=>c.id==1); 2: detail.Content=model.Content; 3: db.SaveChanges();

因?yàn)槲覀儧]有更改任何內(nèi)容,所以更改前與更改后的內(nèi)容是一致的,這時(shí)會(huì)報(bào)出以上錯(cuò)誤

其原因是因?yàn)镸ySQL與SQLServer的處理機(jī)制不同,如果更新內(nèi)容與數(shù)據(jù)庫的一致,SQLServer仍然會(huì)返回受影響行數(shù)為1,但是MySQL則會(huì)認(rèn)為受影響行數(shù)為0。

而Entity Framework應(yīng)該是默認(rèn)以SQLServer的為準(zhǔn),所以認(rèn)為如果更新了,但是返回受影響條數(shù)為0,則認(rèn)為是更新不正確

我們處理這個(gè)問題有很多方法 ,最笨的應(yīng)該是在賦值前進(jìn)行判斷,detail.Content是否與model.Content相等,如果相等就不進(jìn)行賦值。

不過因?yàn)镋ntityFramework是在我們對(duì)屬性賦值時(shí)更新了此屬性的State使之標(biāo)識(shí)為Modified或Deleted等 狀態(tài),所以我們是可以有更方便的方法來控制這些更新的。

我們可以使用EntityFramework的Context中的SavingChanges這個(gè)事件在SaveChanges之前做一些處理:

其基本原理為

if(當(dāng)前實(shí)體已經(jīng)修改 && 所有屬性更改后的值與更改前的值相同){

使之不更新

}

我具體代碼實(shí)現(xiàn)如下

1: public class EntityFrameworkFix 2: { 3: public static void SavingChanges(object sender, EventArgs e) 4: { 5: var context = sender as ObjectContext; 6: if (context == null) return; 7: var updatedEntites = context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified); 8:? 9: foreach (var ose in updatedEntites) 10: { 11: var props = ose.GetModifiedProperties().ToList(); 12: int modifyCount = 0; 13: int propCount = props.Count(); 14: for (int i = 0; i < propCount; i++) 15: { 16: var prop = props[i]; 17: var index = ose.OriginalValues.GetOrdinal(prop); 18: if (ose.OriginalValues.GetValue(index).Equals(ose.CurrentValues.GetValue(index))) 19: { 20: modifyCount++; 21: } 22: } 23: if (modifyCount == propCount) 24: { 25: context.Refresh(RefreshMode.StoreWins, ose.Entity); 26: } 27: } 28: } 29: }

然后我們?cè)谖覀兟暶鰿ontext時(shí)添加如下事件

1: db.SavingChanges += EntityFrameworkFix.SavingChanges;

這樣就可以不執(zhí)行那些賦值了,但值沒有變化的Update。

另外,前些天EntityFramework4.1也發(fā)布了,但是因?yàn)镋ntityFramework4.1中不再支持SavingChanges所以我們要使用其它方法 來支持,我們可以在DbContext中override ValidateEntity方法來實(shí)現(xiàn)這一過程

1: public partial class MyEntities : DbContext 2: { 3: protected override System.Data.Entity.Validation.DbEntityValidationResult ValidateEntity(System.Data.Entity.Infrastructure.DbEntityEntry entityEntry, System.Collections.Generic.IDictionary<object, object> items) 4: { 5: int wrongCount = 0; 6: int allCount = 0; 7: if(entityEntry.State== System.Data.EntityState.Modified) 8: { 9: foreach(var name in entityEntry.OriginalValues.PropertyNames) 10: { 11: var prop = entityEntry.Property(name); 12: if (prop.IsModified) 13: { 14: allCount++; 15: if (prop.OriginalValue.Equals(prop.CurrentValue)) 16: wrongCount++; 17: } 18:? 19: } 20: if (wrongCount == allCount) 21: entityEntry.State = System.Data.EntityState.Unchanged; 22: } 23: return base.ValidateEntity(entityEntry, items); 24: } 25: }

總結(jié)

以上是生活随笔為你收集整理的Entity Framework with MySQL Provider 更新行数为0的Bug的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。