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