如何在代表SQL Server中的Identity字段的POCO上实现ID字段?
问题描述:
如果我有了一个映射到SQL Server标识列ID的域模型,什么是POCO看起来像一个包含字段?如何在代表SQL Server中的Identity字段的POCO上实现ID字段?
候选人1:允许任何人设置和获取的ID。我不认为我们希望任何人从SQL表中设置除存储库以外的标识。
public class Thing {
public int ID {get;set;}
}
候选人2:允许某人在创建时设定的ID,但我们并不知道ID直到我们创建的对象(工厂创建一个空白的事情对象,其中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的方法?
不知怎的,我们就需要让库设置ID而不让消费者去改变它。有任何想法吗?这是在吠叫错误的树吗?我们是否将对象发送到Repository,保存它,扔掉它,然后从加载的版本创建一个新对象并将其作为新对象返回?
答
怎么样的公共get访问,并抛出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字段的值。
非常好的答案。这也意味着领域模型,视图模型,存储库,工厂和任何服务将存在于相同的命名空间(模型)中,这将在任何视图或控制器命名空间(MVC模式)之外,因此它们将不能改变它。如果我有这个正确的话,那么这是一个很好的答案。 – 2010-06-01 03:48:10