如何在代表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异常如果基础值已经是非零一组内部访问?

显然你已经有了物化领域,这样你甚至可以载入记录的一些方法。为什么不使用相同的机制?毕竟,这不仅仅是你需要考虑的身份价值。它基本上可以在数据库中插入/更新后,如计算列,受触发器柱等

+0

非常好的答案。这也意味着领域模型,视图模型,存储库,工厂和任何服务将存在于相同的命名空间(模型)中,这将在任何视图或控制器命名空间(MVC模式)之外,因此它们将不能改变它。如果我有这个正确的话,那么这是一个很好的答案。 – 2010-06-01 03:48:10

更改任何值。如果你将永远知道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字段的值。