2012-04-12 15 views
8

Ho creato la seguente classe POCO e creato anche Contact.FirstName e Contact.LastName proprietà private (queste proprietà sono associate a proprietà appropriate in un modello Entity Framework).Quadro entità, POCO e una proprietà privata

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

mi aspettavo di ottenere una deroga a causa di EF non essere in grado di assegnare valori a queste due proprietà, ma in qualche modo EF ancora riusciti a assegnare i valori a loro. Com'è possibile, dal momento che solo il codice nella classe Contact dovrebbe avere accesso a proprietà private?

si

+31

Entity Framework è magico. Può fare tutto ciò che vuole. –

+0

Hai qualche codice di mappatura? Mappare proprietà private senza configurazione esplicita (o annotazioni in EF 4.3) in realtà non dovrebbe funzionare così facilmente: http://blog.oneunicorn.com/2012/03/26/code-first-data-annotations-on-non-public- properties/ – Slauma

+0

@Slauma: sto utilizzando il primo approccio al database – user702769

risposta

16

Grazie in ambienti con un livello sufficiente di fiducia, reflection può essere utilizzato per accedere ai membri a cui uno normalmente non hanno accesso.

+0

Quindi, questo è anche il modo in cui i Progetti di test sono in grado di accedere ai membri privati? – McGarnagle

+2

@dbaseman: sì, ma c'è anche un 'InternalsVisibleAttribute' che a volte viene usato dal codice sotto test per rendere i suoi membri' interni' accessibili ai test unitari senza la necessità di alcuna riflessione. –

+0

grazie a tutti per il vostro aiuto – user702769

0

Sì - EF, il primo codice sta utilizzando quello in coppia.

Ho visto un comportamento simile con i costruttori privati ​​ - EF/CF può ancora costruire gli oggetti, anche se si 'nasconde', o provare a :) (che è stato il comportamento nelle versioni precedenti, non è sicuro ora) .

E ricordo di aver discusso con le persone della CF sul motivo per cui non inizializzano le proprietà di tipo complesso - mentre sono ancora ok con l'accesso ai membri privati ​​(se ricordo male), è stato molto tempo fa.

Quindi, un po 'di domanda generale - ma in questo senso spero che questo chiarisca almeno qualcosa.

1

Per motivi di completezza: prima il codice EF5 non esegue la mappatura delle proprietà private (almeno per impostazione predefinita) su una colonna della tabella del database.

La seguente classe:

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

Con la seguente DbContext:

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

Genera un tavolo persone con una sola colonna: dbo.People.PersonId (PK, int, not null)

Una proprietà chiave pubblica è richiesta dal codice di default prime convenzioni. Se la proprietà PersonId nella classe Person è privata o protetta, il framework entità genera la seguente eccezione:

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. 
Problemi correlati