2017-03-03 40 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

相關問題