[英]How to implement an ID field on a POCO representing an Identity field in SQL Server?
如果我的域模型具有映射到SQL Server標識列的ID,那么包含該字段的POCO看起來是什么樣的?
候選人1:允許任何人設置和獲取ID。 我認為我們不希望任何人從SQL表中設置除Repository之外的ID。
public class Thing {
public int ID {get;set;}
}
候選人2:允許某人在創建時設置ID,但在我們創建對象之前我們不會知道ID(工廠創建一個空白的Thing對象,其中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的方法?
不知何故,我們需要允許Repository設置ID而不允許消費者更改它。 有任何想法嗎? 這是在錯誤的樹上吠叫嗎? 我們是將對象發送到存儲庫,保存它,扔掉它,然后從加載的版本創建一個新對象並將其作為新對象返回?
如果基礎值已經非零,那么公共get訪問器和內部set訪問器如何拋出InvalidOperationException?
顯然,您已經有了一些實現該字段的方法,以便您甚至可以加載記錄。 為什么不使用相同的機制? 畢竟,不僅僅是您需要考慮的身份價值。 它基本上是在插入/更新之后可以在數據庫中更改的任何值,例如計算列,受觸發器影響的列等。
如果您在創建類時始終知道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字段的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.