2011-03-21 21 views
7

¿Es posible asignar una columna de tabla a un campo de clase en lugar de una propiedad de clase y cómo?Código de Entity Framework Primero: ¿Cómo mapear campos privados?

usted puede hacerlo :)

Siga este enlace: http://weblogs.asp.net/ricardoperes/archive/2013/08/22/mapping-non-public-members-with-entity-framework-code-first.aspx

Ésta es una solicitud común, y realmente tiene sentido; necesitamos usar expresiones LINQ y un poco de magia de reflexión. En primer lugar, una función de ayuda para el retorno de una expresión que apunta a un miembro:

 public static class ExpressionHelper 
     { 
      public static Expression<Func<TEntity, TResult>> GetMember<TEntity, TResult>(String memberName) 
      { 
       ParameterExpression parameter = Expression.Parameter(typeof(TEntity), "p"); 
       MemberExpression member = Expression.MakeMemberAccess(parameter, typeof(TEntity).GetMember(memberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Single()); 
       Expression<Func<TEntity, TResult>> expression = Expression.Lambda<Func<TEntity, TResult>>(member, parameter); 
       return (expression); 
      } 
    } 

Entonces, lo llamamos en el método DbContext.OnModelCreating, como un parámetro para StructuralTypeConfiguration.Property:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Project>().Property(ExpressionHelper.GetMember<Project, Decimal>("Budget")).IsRequired(); 

     base.OnModelCreating(modelBuilder); 
    } 

Respuesta

4

Entidad El Framework (Code First o no) no admite la asignación a un campo; solo a propiedades

ACTUALIZACIÓN Como se señaló en los comentarios, estos documentos son un poco anticuado, pero aún podría ayudar a cualquier principiante lo largo de:

Entity Framework Code first development Resources and Documentation

En aras de la exhaustividad, aquí hay un enlace a lo que está incluido en EF 4.1 RC: EF 4.1 Release Candidate Available

Cambios desde CTP5 (Desde el enlace de arriba):

  • Cambiar nombre de ‘DbDatabase’ a ‘base de datos’. Esta clase también ha movido al espacio de nombres 'System.Data.Entity' , junto con las clases de inicializador de la base de datos.

  • Cambiar nombre de ‘ModelBuilder’ a ‘DbModelBuilder’, para alinear con los otros clases principales.

  • Validación en primer modelo y base de datos. La nueva característica de validación solo se admite en el código Primero en CTP5. En RC la función de validación trabajará con las tres flujos de trabajo de desarrollo (primer modelo, primera base de datos, y el primer código).

  • Complete Intellisense docs. PTC característica no fueron ampliamente documentados porque la superficie API estaba cambiando significativamente entre cada versión. Esta versión incluye la documentación completa .

  • La eliminación de los convenios Código Primera enchufables. convenios enchufables se previsualizar en funciones CTP5 pero no estaban en calidad de entrada en funcionamiento de esta versión .Esta versión todavía admite la eliminación de las convenciones predeterminadas.

  • Consolidación de IsIndependent en el Código API Primera relación. Cuando configuró relaciones en la Característica CTP5, se utilizó el método IsIndependent para identificar que la relación no tenía una propiedad de clave externa expuesta en el modelo de objetos. Esto es ahora hecho llamando al método Map. HasForeignKey se sigue utilizando para las relaciones donde la propiedad clave externa está expuesta en el modelo .

+0

+1 Estoy de acuerdo. He estado buscando un enlace que lo explique antes de publicarlo, pero no lo encontré. De todos modos, estoy bastante seguro de que así es como funciona EF. – Jonathan

+0

Ya he leído todos estos documentos. Por cierto, son viejos. El nuevo RC incluso tiene cambios de última hora. Es por eso que pregunto. ef ef es – mynkow

+0

Es cierto que hay cambios de frenado, pero el soporte para mapeo de campos no estaba en la agenda AFAIK. Y lo siento por los documentos fechados, no sabía el nivel de su conocimiento EF y pensé que podrían ser útiles de todos modos. –

Cuestiones relacionadas