C# 如何在表示SQL Server中的标识字段的POCO上实现标识字段?
如果我有一个域模型,其ID映射到SQL Server标识列,那么包含该字段的POCO看起来是什么样子 候选人1:允许任何人设置和获取ID。我想我们不希望任何人从SQL表中设置ID,除了存储库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 {
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模式)之外,因此它们将无法更改它。如果我的回答是正确的,那么这是一个很好的答案。