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

C# 如何在表示SQL Server中的标识字段的POCO上实现标识字段?,c#,repository,poco,factory,C#,Repository,Poco,Factory,如果我有一个域模型,其ID映射到SQL Server标识列,那么包含该字段的POCO看起来是什么样子 候选人1:允许任何人设置和获取ID。我想我们不希望任何人从SQL表中设置ID,除了存储库 public class Thing { public int ID {get;set;} } 候选对象2:允许某人在创建时设置ID,但直到创建对象之后我们才知道ID(工厂创建一个ID=0的空白对象,直到我们将其持久化)。在持久化之后,我们将如何设置ID public class Thing {

如果我有一个域模型,其ID映射到SQL Server标识列,那么包含该字段的POCO看起来是什么样子

候选人1:允许任何人设置和获取ID。我想我们不希望任何人从SQL表中设置ID,除了存储库

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,而不允许使用者更改ID。有什么想法吗?这是不是找错树了?我们是否将对象发送到存储库,保存它,扔掉它,然后从加载的版本创建一个新对象,并将其作为新对象返回?

如果基础值已经非零,公共get访问器和内部set访问器会抛出InvalidOperationException,如何


显然,您已经有了一些具体化字段的方法,这样您甚至可以加载记录。为什么不使用相同的机制呢?毕竟,这不仅仅是你需要考虑的身份价值观。它基本上是在插入/更新之后在数据库中可以改变的任何值,如计算的列、触发器影响的列等。

如果在创建类时总是知道ID号,并且一旦创建了类,它将永远不会改变,考虑使用<代码>只读< /代码>修饰符,如:

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

回答得很好。这也意味着域模型、视图模型、存储库、工厂和任何服务将存在于同一名称空间(Model)中,而该名称空间将位于任何视图或控制器名称空间(MVC模式)之外,因此它们将无法更改它。如果我的回答是正确的,那么这是一个很好的答案。