[英]Entity Framework 6 Optimistic Concurrency with PostgreSQL
我正在將Npgsql .Net數據提供程序用於PostgreSQL(版本2.1.0-rc1),將Npgsql用於實體框架(版本2.1.0-rc1)和EF(版本6.0.2)進行代碼優先遷移。 在我的實體中,我有:
public int RowVersion { get; set; }
我還具有從EntityTypeConfiguration繼承的每個實體的配置類,並在其中指定了以下內容:
this.Property(m => m.RowVersion).IsConcurrencyToken().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
當我嘗試更新實體時會發生我的問題。 我的update方法查詢數據庫以獲取實體,然后簡單地修改字段,添加修改的日期,然后調用以下覆蓋的SaveChanges:
public override int SaveChanges() {
var objectContextAdapter = this as IObjectContextAdapter;
if (objectContextAdapter != null) {
objectContextAdapter.ObjectContext.DetectChanges();
foreach (ObjectStateEntry entry in objectContextAdapter.ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) {
var v = entry.Entity as BaseEntity;
if (v != null) {
v.RowVersion++;
}
}
}
return base.SaveChanges();
}
數據庫中當前的RowVersion為0。運行代碼時,EF生成以下SQL(從EF Profiler):
UPDATE "dbo"."Car" SET "IsObsolete"=cast(TRUE as boolean), "DateModified"=TIMESTAMP'2014-03-25T15:48:33.5833236+00:00',"ModifiedById"=1 WHERE "CarId"=32) AND ("RowVersion"=0)
這似乎很好,當我直接對數據庫運行SQL時,它成功更新,但是在Visual Studio中,我收到以下錯誤:
EntityFramework.dll中發生類型為'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException'的異常,但未在用戶代碼中處理。 存儲更新,插入或刪除語句影響了意外的行數(0)。 自加載實體以來,實體可能已被修改或刪除。 刷新ObjectStateManager條目。
這是我第一次在PostgreSQL中使用EF。 有人對解決這個問題有什么建議嗎?
這不是您想發生的事情嗎? 您應該捕獲DbUpdateConcurrencyException異常,然后從該位置加載(刷新)數據庫中的值並通知您的用戶,或者從當前存儲在數據庫中的值更新行版本后繼續保存(客戶端獲勝)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.