为什么要在实体中拥有私人制定者

仍然习惯了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;       
}

回答(3)

2 years ago

你不是由数据库自动生成的,所以为什么要做一些没有意义的事情呢?因此,您将 Id setter设为私有 . EF在物化对象时仍然可以设置此属性,即使它是私有的 .

与构造函数相同的故事 . EF要求您的实体具有无参数构造函数,但它可以是私有的 . 但是你不希望(在你的例子中)用户创建实体而不提供名字和姓氏,因为很可能这些名字是必需的,你想要不可避免地表达这个意图 . 因此,您有一个构造函数可以创建实体(两个名称都已设置),另一个构造函数用于实现从数据库接收的对象(无参数的一个) .

请注意,EF不需要私有setter和构造函数的这种配置 . 所有这些都是为了方便开发人员以防止意外行为(设置 Id 字段或在不提供名称的情况下设置 Emp 实体) .

2 years ago

私有setter对于向用户提供只读属性非常有用,这意味着它不允许您修改它 . 因为像 ID 这样的某些属性你不希望它被修改,或者,如果你想在类级别添加一些验证或设置属性(来自类中) . 在这种情况下,我们使用像私人设定器 .

public int Id { get; private set; }

或者有时候喜欢

private int Id ;
public int Id 
{
    get { return Id ; }
}

2 years ago

除了提供的答案之外,随着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以获取更多信息

对于私有构造函数:使用私有构造函数,您不希望通过类外部的代码创建类 . Singletonsfactoriesstatic method objects是限制构造函数的示例 .