2011-05-16 18 views
13

Tengo una clase que contiene algunos campos privados/protegidos y algunos captadores públicos que devuelven el valor de los campos. Estoy intentando asignar los campos a las columnas de la base de datos utilizando la API fluida en DbModelBinder en OnModelCreating. No puedo usar una propiedad automática con un setter protegido, así que no lo ofrezcas como una solución a mi pregunta. Probablemente funcionaría, estoy seguro pero no puedo usar la propiedad automática ya que la clase de dominio es código compartido y se usa con otros ORM diferentes que tienen diferentes formas de mapear sus campos y desafortunadamente uno no admite elAsignación de un nombre de campo que comienza con un guión bajo en Entity Framework 4.1 Código Primero

I utilizar el siguiente código (que se encuentra en stackoverflow) para acceder a la zona protegida de modo que pueda utilizar la expresión cuando el mapeo:

public static class ObjectAccessor<T> 
where T : class 
{ 
    public static Expression<Func<T, TResult>> CreateExpression<TResult>(string propertyOrFieldName) 
    { 
     ParameterExpression param = Expression.Parameter(typeof(T), "propertyOrFieldContainer"); 
     Expression body = Expression.PropertyOrField(param, propertyOrFieldName); 
     LambdaExpression lambda = Expression.Lambda(typeof(Func<T, TResult>), body, param); 

     return (Expression<Func<T, TResult>>)lambda; 
    } 
} 

todo esto funciona maravillosamente si el nombre del campo es m_username pero si uso _username consigo un ModelValidationException : Se detectaron uno o más errores de validación durante la generación del modelo: System.Data.Edm.EdmProperty: Nombre: El nombre especificado no está permitido: '_nombre de usuario'.

No puedo usar camelcase sin el guión bajo ya que el ayudante anterior no puede distinguir entre la propiedad de nombre de usuario público y el campo de nombre de usuario protegido. Realmente me gustaría seguir usando el camello de subrayado sin el prefijo de la letra.

¿Es posible configurar el ModelBinder de algún modo para que la validación acepte el nombre de la propiedad con un guion bajo?

Gracias de antemano,

Marcar

+1

consigo la sospecha furtiva de que estás planeando dispararte en el pie. Hay formas de cargar datos en su objeto de dominio sin romper la ocultación de encapsulación/información. –

+0

@Mark, lamento formular esta pregunta, pero ¿qué lo motivaría a usar simultáneamente múltiples ORM en la misma aplicación? Me da la impresión de que se encuentra en una especie de entorno corporativo, tal vez altamente politizado, con múltiples desarrolladores/equipos. Lo más probable es que esté apoyando algún tipo de aplicación interna gigantesca que probablemente ya sufra una fragmentación arquitectónica grave. Tal vez no pueda hacerlo ahora, pero recomiendo encarecidamente que en algún momento, alguien debe estandarizar en un solo ORM. Codificar su aplicación ahora es posible. Apoyarlo después será una pesadilla. –

+0

Un punto válido y sin duda una arquitectura que no recomendaría: no es mi intención utilizar múltiples ORM en el mismo entorno. Sin embargo, el código en cuestión es parte de una capa abstracta sobre el ORM que proporciona una interfaz para el comportamiento ORM común, un marco para proveedores ORM conectables si se quiere. Por ejemplo, utilizo una forma abstracta de definir estrategias de búsqueda que oculta al desarrollador la forma específica de ORM de implementar la carga ansiosa. – Mark

Respuesta

0

Parece que la decoración de su campo de la siguiente manera:

[Column("username")] 
public string _username 

tal vez útiles en su caso, de todos modos - por favor revise similar case

Cuestiones relacionadas