2012-04-12 14 views
8

Creé la siguiente clase POCO y también hice que las propiedades Contact.FirstName y Contact.LastName fueran privadas (estas propiedades se asignan a las propiedades apropiadas en un modelo de Entity Framework).Marco de entidad, POCO y una propiedad privada

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

Me esperaba obtener una excepción debido a EF no ser capaz de asignar valores a estas dos propiedades, pero de alguna manera se las arregló EF para asignar valores a ellos. ¿Cómo es posible, ya que solo el código en la clase Contact debería tener acceso a propiedades privadas?

que

+31

Entity Framework is magic. Puede hacer lo que quiera. –

+0

¿Tiene algún código de mapeo? El mapeo de propiedades privadas sin una configuración explícita (o anotaciones en EF 4.3) en realidad no debería ser tan fácil: http://blog.oneunicorn.com/2012/03/26/code-first-data-annotations-on-non-public- propiedades/ – Slauma

+0

@Slauma: estoy usando el primer enfoque de base de datos – user702769

Respuesta

16

Gracias En entornos con un nivel suficiente de confianza, reflection se pueden utilizar para acceder a los miembros a los que no se pueda acceder normalmente.

+0

¿Así que esta es también la forma en que los proyectos de prueba pueden obtener acceso a miembros privados? – McGarnagle

+2

@dbaseman: sí, pero también hay un 'InternalsVisibleAttribute' que algunas veces usa el código bajo prueba para hacer que sus miembros' internos' sean accesibles para pruebas unitarias sin la necesidad de reflexión alguna. –

+0

gracias a todos por su ayuda – user702769

0

Sí - EF, el código primero está utilizando eso en lugares par.

He visto un comportamiento similar con los constructores privados - EF/CF puede construir sus objetos incluso si lo 'oculta' o intenta :) (ese era el comportamiento en versiones anteriores, ahora no estoy seguro) .

Y recuerdo haber tenido alguna discusión con personas de CF sobre por qué no inicializan las propiedades de tipo complejo - si todavía están bien para acceder a los miembros privados (si mal no recuerdo), fue hace mucho tiempo.

Entonces, un poco de pregunta general, pero en ese sentido espero que esto aclare algo al menos.

1

Para mayor completud: el código EF5 primero no (al menos de forma predeterminada) correlaciona propiedades privadas con una columna de tabla de base de datos.

La clase siguiente:

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

Con el siguiente DbContext:

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

genera una tabla de personas con una sola columna: dbo.People.PersonId (PK, int, not null)

Una propiedad clave pública es requerido por el código predeterminado primeras convenciones. Si la propiedad PersonId en la clase Person sería privada o protegida, el marco de entidades arroja la siguiente excepción:

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. 
Cuestiones relacionadas