原始
因为Ef 6.0,我有一个对象。我有一个单一的实例,并希望确保,没有其他代码能够更改其值。
是否有任何架构,模式来确保它。不可变,结构,只读没有什么是如此干净。或者我是否要求太多形式的流行语言?
被修改
因为Ef 6.0,我有一个对象。 我有一个单一的实例,并希望确保,没有其他代码能够更改其值。
1.是否有任何架构,模式来确保它。 不可变的模式,结构,只读 EF无法使用。 我是不是要求这么流行的语言?
2.在完成所需的更改后,有没有办法锁定对象?
答案 0 :(得分:6)
没有任何会员可以更改您的课程内容,例如属性设置者(制作设置者private
)。
不要让方法改变你的变量。 (你应该让它们readonly
。)
仅修改构造函数中的字段,属性和变量。
基本示例:
public class X
{
public X(string y)
{
this.y = y;
}
private readonly string y;
public string Y { get { return y; } }
}
答案 1 :(得分:0)
考虑您使用的所有值对象。约会是一个很好的。您可以将类的数据作为构造函数的一部分,并在构造时仅分配一次。正如已经指出的那样,您可以将属性字段设置为私有以设置和公共获取。对于状态更改功能,您可以从状态更改方法返回新实例。一个很好的例子是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
我发现这是最有效的模式,特别是当你开始需要状态改变逻辑时。在多线程环境中很棒。
答案 2 :(得分:0)
使Ef对象不可变的答案:
私人财产制定者。
public class Users
{
public int Id { get;private set; }
public string FirstName { get;private set; }
public string LastName { get; private set; }
}
Courtse - J.斯蒂恩
答案 3 :(得分:0)
这是一个老问题,但我遇到了同样的问题,并提出了以下解决方案,将其留在这里,以便其他人可能在未来受益:
OriginalData = Context.Entry(MyBindingSource.Current).CurrentValues.ToObject();
请注意,MyBindingSource.Current是我的实体。