簡體   English   中英

如何在表示SQL Server中的標識字段的POCO上實現ID字段?

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

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