2013-12-18 21 views
2

如果在DB上更改了POCO條目,是否有任何內置的可能性檢測?
例如:檢測數據庫條目中的更改

  1. 用戶1點的編輯與ID 1
  2. 用戶2目的還編輯對象ID爲1,並保存。
  3. 用戶1也節省了,並覆蓋用戶2的變化

我試着重裝對象並進行比較,但是這是一個有點太複雜了。

所以我想實現的是自動檢查在保存更改之前對象是否在數據庫中更改。

回答

2

實現併發令牌描述,我會選擇將加入審計領域的方式。

public class SomeEntity 
{ 
    public int ID { get; set; } 
    public string SomeProperty { get; set; } 

    [ConcurrencyCheck] 
    [Timestamp] 
    public byte[] Version { get; set; } 
} 

以上,步驟#3將不會發生。當第二個用戶去保存他們的更改時,數據庫將不允許它。當您嘗試保存更改時,EF會拋出併發異常,因爲第二個編輯版本不匹配。我相信確切的例外類型是DbUpdateConcurrencyException

如果您使用的是一口流利的API,不希望在你的實體的屬性,這樣做:

Property(x => x.Version).IsConcurrencyToken(true).IsRowVersion(); 

更新

我收回我下面的評論,有點.. ..

首先使用代碼(不是EDMX),有一種方法可以在全局範圍內應用這些屬性。我做了一次,現在正在慢慢地嘗試解開它。你可以做的是實現一個抽象的實體,然後把所有的其他實體繼承它:

public abstract class BaseEntity 
{ 
    [ConcurrencyCheck] 
    [Timestamp] 
    public byte[] Version { get; set; } 

    // can also do this globally in FluentAPI with custom EntityTypeConfiguration 
} 

public class SomeEntity : BaseEntity 
{ 
    public int ID { get; set; } 
    public string SomeProperty { get; set; } 
} 

然而,在做這件事,我不推薦。其他人可能會不同意,但我相信你應該只在有充分理由的情況下強制實體的併發。

+0

謝謝!這是我尋找的東西。是否也有可能將此設置設置爲全局整個表格或甚至整個.edmx? –

+1

我不這麼認爲,但我不確定。現在您已經知道如何爲一個實體執行此操作,但您可以搜索Web並詢問另一個SO問題,即如何將全局併發性同時應用於整個實體模型。 – danludwig

+0

我更新了我的答案,請閱讀。 – danludwig