如果我的域模型具有映射到SQL Server标识列的ID,那么POCO包含该字段的内容是什么?
候选人1:允许任何人设置并获取ID。我认为我们不希望任何人从SQL表中设置除存储库之外的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而不允许消费者更改它。有任何想法吗?这是在错误的树上吠叫吗?我们是将对象发送到存储库,保存它,扔掉它,然后从加载的版本创建一个新对象并将其作为新对象返回?
答案 0 :(得分:4)
如果基础值已经非零,公共get访问器和内部set访问器如何抛出InvalidOperationException?
显然你已经有了实现这个领域的方法,你甚至可以加载记录。为什么不使用相同的机制?毕竟,不仅仅是您需要考虑的身份价值。它基本上是在插入/更新之后可以在数据库中更改的任何值,例如计算列,受触发器影响的列等。
答案 1 :(得分:2)
如果您在创建课程时始终知道身份证号码,并且在创建课程后它永远不会改变,请考虑使用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字段的值。