8

次の POCO クラスを作成しContact.FirstNameContact.LastNameプロパティをプライベートにしました (これらのプロパティは Entity Framework モデルの適切なプロパティにマップされます)。

public class Contact
{
    public int ContactID { get; set; }
    private string FirstName { get; set; }
    public string LastName { get; private set; }
}

EF がこれら 2 つのプロパティに値を割り当てることができないために例外が発生することを期待していましたが、どういうわけか EF はそれらに値を割り当てることができました。クラス内のコードのみContactがプライベート プロパティにアクセスする必要があるため、それはどのように可能でしょうか?

ありがとうございました

4

3 に答える 3

17

十分なレベルの信頼がある環境では、リフレクションを使用して、通常はアクセスできないメンバーにアクセスできます。

于 2012-04-12T17:59:35.473 に答える
1

完全を期すために: EF5 コードは最初に (少なくとも既定では) プライベート プロパティをデータベース テーブルの列にマップしません。

次のクラス:

public class Person {
  public int PersonId { get; set; }
  private string Name { get; set; }
}

次の DbContext を使用します。

public class PrivatePropertiesContext : DbContext {
  public DbSet<Person> People {
    get;
    set;
  }
}

列が 1 つだけの People テーブルを生成します。dbo.People.PersonId (PK, int, not null)

既定のコード優先規則では、公開キー プロパティが必要です。Person クラスのPersonIdプロパティが非公開または保護されている場合、エンティティ フレームワークは次の例外をスローします。

System.Data.Entity.Edm.EdmEntityType: : EntityType 'Person' has no key defined. Define the key for this EntityType.
System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'People' is based on type 'Person' that has no keys defined.
于 2013-03-05T13:57:30.490 に答える
0

はい - EF、コードは最初にそれをいくつかの場所で利用しています。

プライベート コンストラクターで同様の動作を見たことがあります。EF/CF は、オブジェクトを「非表示」にしたり、試行したりしても、オブジェクトを構築できます :) (これは以前のバージョンの動作でしたが、今はわかりません)。

そして、複合型のプロパティを初期化しない理由について CF の人々と話し合ったことを覚えています。

それで、少し一般的な質問ですが、その意味では、これが少なくとも何かを明確にすることを願っています.

于 2012-04-12T18:29:32.460 に答える