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

Jam*_*mes 6 c# setter constructor entity-framework

仍然习惯了Entity框架,但我已经看到了类似下面的代码,他们在Entity中拥有id的私有setter.

public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
Run Code Online (Sandbox Code Playgroud)

为什么有些人会有私人制定者.这个Id字段无论如何都是在数据库中自动生成的,这是因为它设置为私有?

另外,为什么我们需要私有构造函数和公共构造函数,如下所示?

private Emp() { }

public Emp(string name, string lastname)
{
    FirstName = firstname;
    LastName = lastname;       
}
Run Code Online (Sandbox Code Playgroud)

Evk*_*Evk 9

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

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

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

  • @Happy,不,EF 必须具有 _parameterless_ 构造函数才能创建您的实体。它可以是私人的或公共的,这无关紧要。所有其他构造函数都是可选的。通常人们只创建一个公共无参数构造函数(或者根本没有构造函数 - 然后自动生成无参数构造函数)。但是在您的示例中,作者希望_防止_在不提供名字和姓氏的情况下创建新 Emp(以便开发人员不会忘记这样做),因此您有两个构造函数,其中一个是私有的。 (3认同)

Vip*_*ock 5

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

public int Id { get; private set; }
Run Code Online (Sandbox Code Playgroud)

或有时像

private int Id ;
public int Id 
{
    get { return Id ; }
}
Run Code Online (Sandbox Code Playgroud)