2017-03-03 8 views
6

まだエンティティフレームワークに慣れていますが、私はエンティティのidのプライベートセッターを持っている以下のようなコードを見てきました。なぜエンティティにプライベートセッターを持っているのですか

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がデータベースから受け取ったオブジェクト(パラメータなしのもの)を作成するためのエンティティを作成するコンストラクタが1つあります。

プライベートセッターとコンストラクタのこの設定は、EFでは決して必要ではありません。これらのすべては、望ましくない動作を防ぐために開発者の便宜のために行われます(名前を付けずにIdフィールドまたはEmpエンティティを設定する)。

+0

ああ、そのためにはプライベートとパブリックのコンストラクタを必須としていますか? – Happy

+1

@Happy、いいえ、エンティティを作成できるようにEF用の_parameterless_コンストラクタを持つことは必須です。それはプライベートでもパブリックでも構いませんが、それは問題ではありません。他のすべてのコンストラクタはオプションです。通常、パラメータのないコンストラクタは1つだけ作成されます(またはコンストラクタはまったく作成されません。パラメータのないコンストラクタは自動的に生成されます)。しかし、あなたの例では、作成者は姓と名義を提供せずに新しいEmpを作成したいので、開発者はそれを忘れることはありません。そのため、2つのコンストラクタがあります。 – Evk

+0

あなたはその必須ではないことを意味しますか? – Happy

4

プライベートセッターはユーザーに読み取り専用プロパティを提供するのに便利です。つまり、ユーザーが変更できるようにすることはできません。 IDのようないくつかのプロパティは、バリデーションを追加したり、(クラスの中から)クラスレベルのプロパティを設定したい場合には、修正する必要はありません。そのような場合は私たちはプライベートセッターを使います。あなたが今までそれがデータベースによって自動生成されます正確にするため、主要なカラム値を自分で設定する必要があり、なぜ意味がありません物事を行うことはできません

public int Id { get; private set; } 

または

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

提供された回答に加えて、C#6.0の導入により、プロパティの値を設定するためのプライベート設定が不要になりました。プライベートコンストラクタが使用されているあなたがするクラスを望んでいない:あなたはより多くの情報

プライベートコンストラクタについては

ためhereを確認することができます

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

はあなたではなく、民間のセッターの次のコードを使用することができますクラス外のコードによって作成されます。 Singletonsfactoriesstatic method objectsは、コンストラクタを制限すると便利な場合の例です。

+0

コンストラクタはどうですか? – Happy

関連する問題