2017-03-03 51 views
6

仍然习惯于实体框架,但我看到下面的代码,他们在实体中拥有私人设置器。为什么要在实体中使用私人设置器

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;  
} 

回答

8

你不要老是需要为自己设定的主要列值,正是因为它是由数据库自动生成,那么为什么允许做的事情,没有意义?因此,您将Id设置为私人。在实现对象时,EF仍然可以设置此属性,即使它是私有的。

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

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

+0

哦,所以它必须有私人和公共构造? – Happy

+1

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

+0

你的意思是它不是强制性的? – Happy

4

私人二传手是提供一个只读属性是有用的,意味着它不会允许你修改它。因为一些属性如ID你不希望它被修改,或者如果你想添加一些验证或者在类级别(从类中的from)设置属性。在那种情况下,我们使用私人二传手。

public int Id { get; private set; } 

或有时像

private int Id ; 
public int Id 
{ 
    get { return Id ; } 
} 
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是限制构造函数有用的示例。

+0

构造函数呢? – Happy

相关问题