2012-04-12 8 views
8

Utworzono następującą klasę POCO, a także zmieniono prywatne właściwości Contact.FirstName i Contact.LastName (te właściwości są odwzorowywane na odpowiednie właściwości w modelu Entity Framework).Struktura obiektu, POCO i własność prywatna

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

Oczekiwano, że otrzymam wyjątek, ponieważ EF nie może przypisać wartości do tych dwóch właściwości, ale w jakiś sposób EF wciąż zdołał przypisać do nich wartości. Jak to jest możliwe, ponieważ tylko kod w klasie Contact powinien mieć dostęp do właściwości prywatnych?

Dziękuję

+31

Entity Framework to magia. Może robić, co chce. –

+0

Czy masz kod mapowania? Odwzorowywanie prywatnych właściwości bez jawnej konfiguracji (lub adnotacji w wersji 4.3) powinno w rzeczywistości nie działać tak łatwo: http://blog.oneunicorn.com/2012/03/26/code-first-data-annotations-on-non-public- properties/ – Slauma

+0

@Slauma: Używam pierwszego podejścia do bazy danych – user702769

Odpowiedz

16

W środowiskach o wystarczającym poziomie zaufania, reflection może być używany do dostępu członków do którego normalnie nie ma dostępu.

+0

Więc w ten sposób projekty testowe są w stanie uzyskać dostęp do prywatnych członków? – McGarnagle

+2

@dbaseman: tak, ale istnieje również "InternalsVisibleAttribute", który jest czasami używany przez testowany kod, aby jego "wewnętrzne" elementy były dostępne dla testów jednostkowych bez potrzeby refleksji. –

+0

dziękuję wszystkim za pomoc – user702769

0

Tak - EF, kod najpierw wykorzystuje to w kilku miejscach.

Widziałem podobne zachowanie z prywatnych konstruktorów - EF/CF może nadal budować swoje obiekty, nawet jeśli „ukryć”, albo spróbować :) (to było zachowanie we wcześniejszych wersjach, nie wiem teraz) .

Pamiętam, że po rozmowach z osobami z CF na temat tego, dlaczego nie inicjują one właściwości złożonych - a wciąż są w porządku z dostępem do prywatnych członków (jeśli dobrze pamiętam), to było dawno temu.

Tak więc, trochę ogólne pytanie - ale w tym sensie nadzieję, że to co najmniej wyjaśnia.

1

Dla kompletności: Kod EF5 jako pierwszy nie (przynajmniej domyślnie) mapuje prywatne właściwości do kolumny tabeli bazy danych.

następujące klasy:

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

z następującymi DbContext:

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

Generuje Ludzie tabeli z tylko jedną kolumnę: dbo.People.PersonId (PK, int, not null)

Właściwość klucz publiczny jest domyślnie wymagane kodu pierwsze konwencje. Jeśli właściwość PersonId w klasie Person będzie prywatna lub chroniona, struktura obiektu zgłasza następujący wyjątek:

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. 
Powiązane problemy