2010-06-01 32 views
3

如果我有了一個映射到SQL Server標識列ID的域模型,什麼是POCO看起來像一個包含字段?如何在代表SQL Server中的Identity字段的POCO上實現ID字段?

候選人1:允許任何人設置和獲取的ID。我不認爲我們希望任何人從SQL表中設置除存儲庫以外的標識。

public class Thing { 
    public int ID {get;set;} 
} 

候選人2:允許某人在創建時設定的ID,但我們並不知道ID直到我們創建的對象(工廠創建一個空白的事情對象,其中ID = 0,直到我們堅持的話)。如何在持續後設置ID?

public class Thing { 
    public Thing() : This (ID: 0) {} 
    public Thing (int ID) { 
     this.ID = ID 
    } 
    private int _ID; 
    public int ID { 
     get { return this.ID;}; 
    } 

候選3:設置ID的方法?

不知怎的,我們就需要讓庫設置ID而不讓消費者去改變它。有任何想法嗎?這是在吠叫錯誤的樹嗎?我們是否將對象發送到Repository,保存它,扔掉它,然後從加載的版本創建一個新對象並將其作爲新對象返回?

回答

4

怎麼樣的公共get訪問,並拋出InvalidOperationException異常如果基礎值已經是非零一組內部訪問?

顯然你已經有了物化領域,這樣你甚至可以載入記錄的一些方法。爲什麼不使用相同的機制?畢竟,這不僅僅是你需要考慮的身份價值。它基本上可以在數據庫中插入/更新後,如計算列,受觸發器柱等

+0

非常好的答案。這也意味着領域模型,視圖模型,存儲庫,工廠和任何服務將存在於相同的命名空間(模型)中,這將在任何視圖或控制器命名空間(MVC模式)之外,因此它們將不能改變它。如果我有這個正確的話,那麼這是一個很好的答案。 – 2010-06-01 03:48:10

2

更改任何值。如果你將永遠知道ID號創建類的時候,它永遠不會改變,一旦類已經創建,可以考慮使用readonly修改,就像這樣:

public class Thing { 
    public Thing() : This (ID: 0) {} 
    public Thing (int ID) { 
     this._ID = ID 
    } 
    private readonly int _ID; 
    public int ID { 
     get { return this._ID;}; 
    } 
} 

這將阻止你在編譯時從後它已經由構造函數設置改變_ID字段的值。

相關問題