2012-07-13 54 views
1

問題獲取實體,其狀態增加了

我實施的UnitOfWork和我的Web應用程序庫的風格數據訪問層的主鍵。我想用我自己製作的自定義表來審覈對數據庫的更改。將新項目添加到上下文時會發生問題。該項目被添加到上下文中,但SaveChanges()方法尚未被調用,因此該實體仍處於Added狀態。這意味着尚未分配主鍵,這意味着我無法創建審計記錄,並且從存儲庫中調用SaveChanges()將違反存儲庫編碼風格。有沒有辦法獲得添加狀態的實體主鍵?

嘗試性解決方案

,我能想到的唯一解決方法是使用隨機的GUID,以便客戶端可以生成它們。我有點猶豫,因爲我聽說使用隨機的GUID作爲身份字段可能代價高昂。

代碼

//Method in my repository class 
public void Insert(T entity) 
{ 
    //Adds the entity the context 
    dbSet.Add(entity); 

    Audit audit= new Audit 
    { 
     Created = DateTime.Now, 
     PrimaryKey = entity.Key, //This is not set because the State of the entity is still Added 
    }; 

    Context.Audits.Add(audit); 
} 

回答

2

簡單的答案是,你不能在分佈式環境中做到這一點。一旦項目被保留,你不能保證該ID是相同的。

使用客戶端生成的GUID可以解決問題。這是我通常採取的方法,但我們不要就此開始辯論!你大多會發現結果是50/50。兩者都有優點和缺點。對於你的情況,它的工作原理!

+1

不要在數據庫的GUID列上集羣,不管你做什麼 – 2012-07-13 19:51:40

+0

這意味着我的數據庫中的所有索引都必須是非連續的GUID。我不知道這將如何影響性能 – 2012-07-16 14:31:19

+0

您需要權衡這個要求。在您的方案中預先保留項目並讓數據庫生成順序標識是否是更好的選擇? – 2012-07-16 14:52:01