簡體   English   中英

PostgreSQL的Entity Framework 6樂觀並發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM