如何在表示SQL Server中的标识字段的POCO上实现ID字段?

时间:2010-06-01 02:20:30

标签: c# repository poco factory

如果我的域模型具有映射到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而不允许消费者更改它。有任何想法吗?这是在错误的树上吠叫吗?我们是将对象发送到存储库,保存它,扔掉它,然后从加载的版本创建一个新对象并将其作为新对象返回?

2 个答案:

答案 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字段的值。