繁体   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