Original
我有一个对象作为 Ef 6.0 的结果.我有一个实例,并希望确保没有其他代码能够更改其值。
是否有任何架构,模式来确保它。不可变,结构,只读,没有什么是那么干净。还是我对这种流行语言的要求太高了?
编辑
我有一个对象作为 Ef 6.0 的结果.我有一个实例,并希望确保没有其他代码能够更改其值。
1.Is 有任何架构,模式来确保它。不可变模式,结构,只读任何内容都可用于EF。我要求这种流行的语言太多了吗?
2.Is 有办法在完成所需的更改后锁定对象?
没有任何可以更改类内容的成员,例如属性 setters(使 setter private
)。
不要让方法更改变量。(你应该让它们readonly
可能)。
仅改变构造函数中的字段、属性和变量。
基本示例:
public class X
{
public X(string y)
{
this.y = y;
}
private readonly string y;
public string Y { get { return y; } }
}
想想你使用的所有值对象。 日期是个好。您可以将类的数据作为构造函数的一部分,并在构造时仅分配一次。如前所述,您可以将属性字段设为私有以设置,并将公共字段设为获取。对于状态更改功能,可以从状态更改方法返回新实例。一个很好的例子是 DateTime 上的 AddDays 方法。这会保持原始日期不变,但会返回一个新日期,并将适当的日期添加到原始日期时间。
Var date = new DateTime(2015,01,01);
Var newDate = date.AddDays(15);
// date is now 2015,01,01
// newDate is now 2015,01,16
我发现这是最有效的模式,尤其是当您开始需要状态更改逻辑时。非常适合多线程环境。
使 Ef 对象不可变的答案:
私人财产设置者。
public class Users
{
public int Id { get;private set; }
public string FirstName { get;private set; }
public string LastName { get; private set; }
}
考特斯– J. 斯蒂恩
老问题,但我遇到了同样的问题,并提出了以下解决方案,将其留在这里,以便其他人将来可能会受益:
OriginalData = Context.Entry(MyBindingSource.Current).CurrentValues.ToObject();
请注意,MyBindingSource.Current 是我的实体。