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

时间:2017-03-03 07:38:29

标签: c# entity-framework constructor setter

仍然习惯于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 个答案:

答案 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了解详情

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