2011-03-21 2 views
7

Est-il possible de mapper une colonne de table à un champ de classe à la place d'une propriété de classe et comment?Entity Framework Code First: Comment mapper des champs privés?

vous pouvez le faire :)

Suivez ce lien: http://weblogs.asp.net/ricardoperes/archive/2013/08/22/mapping-non-public-members-with-entity-framework-code-first.aspx

Ceci est une demande commune, et prend tout son sens; nous devons utiliser des expressions LINQ et un peu de magie de réflexion. Tout d'abord, une fonction d'aide pour retourner une expression qui pointe vers un membre:

 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); 
      } 
    } 

Ensuite, nous l'appelons la méthode DbContext.OnModelCreating, en tant que paramètre à StructuralTypeConfiguration.Property:

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

     base.OnModelCreating(modelBuilder); 
    } 

Répondre

4

Entité Framework (Code First ou non) ne prend pas en charge le mappage à un champ; seulement aux propriétés.

MISE À JOUR Comme indiqué dans les commentaires, ces documents sont un peu vieillot mais pourrait encore aider à tout débutant le long:

Entity Framework Code first development Resources and Documentation

Par souci d'exhaustivité, voici un lien vers ce qui est inclus dans EF 4.1 RC: EF 4.1 Release Candidate Available

Changements depuis le CTP5 (à partir du lien ci-dessus):

  • Renommer des « DbDatabase » à « base de données ». Cette classe a également déplacé vers l'espace de noms 'System.Data.Entity' , avec les classes d'initialisation de la base de données.

  • de renommer « ModelBuilder » sur « DbModelBuilder », à aligner avec les autres classes de base.

  • Validation dans Model First et Database First. La nouvelle fonctionnalité de validation était uniquement prise en charge dans le code Premier dans CTP5. Dans RC la fonctionnalité de validation fonctionnera avec les trois workflows de développement (Modèle Premier, Base de données d'abord, et Code Premier).

  • Documents complets Intellisense. La fonctionnalité CTP n'a pas été largement documentée car la surface de l'API changeait significativement entre chaque version. Cette version inclut la documentation complète .

  • Suppression des premières conventions enfichables. Les conventions enfichables ont été prévisualisées dans la fonction CTP5 mais n'étaient pas en cours de mise en production pour cette version .Cette version prend toujours en charge la suppression des conventions par défaut.

  • Consolidation de IsIndependent dans l'API de relation Code First. Lorsque la configuration des relations dans la fonctionnalité CTP5 la méthode IsIndependent a été utilisée pour identifier que la relation a pas avoir une propriété de clé étrangère exposée dans le modèle objet. C'est maintenant en appelant la méthode Map. HasForeignKey est toujours utilisé pour les relations où la propriété de clé étrangère est exposée dans le modèle .

+0

+1 Je suis d'accord. J'ai cherché un lien qui l'explique avant de poster, mais je ne l'ai pas trouvé. Quoi qu'il en soit, je suis à peu près sûr que c'est ainsi que fonctionne EF. – Jonathan

+0

J'ai déjà lu tous ces documents. Btw, ils sont vieux. Le nouveau RC a même des changements de rupture. C'est pourquoi je demande. ef ef es – mynkow

+0

Il est vrai qu'il y a des changements de freinage, mais le soutien à la cartographie des champs n'était pas à l'ordre du jour AFAIK. Et désolé pour les documents datés, ne connaissait pas le niveau de vos connaissances EF et pensé qu'ils pourraient être utiles de toute façon. –

Questions connexes