仍然习惯于Entity框架,但我已经看到了类似下面的代码,他们在Entity中拥有id的私有setter。
public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
为什么有些人会有私人制定者。无论如何,这个Id字段在数据库中自动生成,这是因为它设置为私有?
另外,为什么我们需要私有构造函数和公共构造函数,如下所示?
private Emp() { }
public Emp(string name, string lastname)
{
FirstName = firstname;
LastName = lastname;
}
答案 0 :(得分:9)
您不需要自己设置主要列值,这完全是因为它是由数据库自动生成的,所以为什么要允许做一些没有意义的事情?因此,您将Id
setter设为私有。 EF在物化对象时仍然可以设置此属性,即使它是私有的。
与构造函数相同的故事。 EF要求您的实体具有无参数构造函数,但它可以是私有的。但是,您不希望(在您的示例中)用户创建实体而不提供名字和姓氏,因为很可能这些名称是必需的,并且您希望不可避免地表达此意图。因此,您有一个构造函数可以创建实体(两个名称都已设置),另一个构造函数用于实现从数据库接收的对象(无参数的一个)。
请注意,EF不需要私有setter和构造函数的这种配置。所有这些都是为了方便开发人员以防止意外行为(设置Id
字段或crearing Emp
实体而不提供名称)。
答案 1 :(得分:4)
私有设置器对于向用户提供只读属性非常有用,这意味着它不允许您修改它。因为像ID
这样的某些属性你不希望它被修改,或者,如果你想在类级别添加一些验证或设置属性(来自类中)。在这种情况下,我们使用像私人设定器。
public int Id { get; private set; }
或某些时候喜欢
private int Id ;
public int Id
{
get { return Id ; }
}
答案 2 :(得分:1)
除了提供的答案之外,随着C#6.0的引入,您不再需要私有的setter来设置属性的值。
您可以使用以下代码代替私人设置器:
public class Appointment
{
public DateTime TimeStamp { get; } = DateTime.UtcNow;
public string User { get; } =
System.Security.Principal.WindowsPrincipal.Current.Identity.Name;
public string Subject{ get; } = "New Subject"
}
您可以查看here了解详情
对于私有构造函数:使用私有构造函数,您不希望通过类外部的代码创建类。 Singletons,factories,static method objects是限制构造函数的示例。