EF6 ignorant et dans les classs d'entités

J'ai utilisé les outils EF6 Database First pour générer des classs C # pour 2 tables à partir de ma database, puis (comme indiqué dans l'article de blog qui m'a aidé à faire cela) à copyr les files .cs dans un nouveau projet. J'ai apporté quelques modifications aux classs pour prendre en charge les noms sensés dans mon code C #. Voici un extrait de l'une des classs avec "LongTableName" remplaçant un nom étrangement long utilisé dans la database.

namespace RidesData { [Table("LongTableName")] public partial class PhoneData { [Key] [Column("LongTableNameID")] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } [Column("LongTableNameAccountID")] public int AccountID { get; set; } // more fields } } 

Je ne suis pas en contrôle des noms de table, ni le fait que la plupart des noms de colonnes ont le nom de la table comme préfixes. Mais les idées de Code First dans EF6 devraient, je pense, me laisser utiliser des noms de class et de domaine raisonnables malgré cela. (Le générateur de code de la database a fait du bon travail en ajoutant du code à OnModelCreating pour spécifier qu'aucune des colonnes correspondant aux données de string C # n'utilisait Unicode.)

Mon model (généré par les outils EF6 et qui hérite de DbContext) inclut (après un certain changement de nom par moi)

  public virtual DbSet<PhoneData> PhoneRecs { get; set; } 

et je pensais que tout irait bien quand j'ai créé une instance de PhoneData, peuplé, et fait

  Model.PhoneRecs.Add(phoneData); 

mais la première chose qui s'est produite quand j'ai exécuté le code – bien avant tout appel à SaveChanges() – était que EF a généré des instructions CREATE TABLE pour les deux tables; la table correspondant à l'extrait ci-dessus s'appelait PhoneDatas (n'utilisant pas le nom de la table spécifiée) et les noms de colonnes étaient les mêmes que les noms de champs de la class (pas ce qui était spécifié dans les attributes Column (…)).

Bien sûr, la table que j'avais spécifiée n'avait pas besoin d'être créée. EF avait juste à dire que je voulais utiliser les noms de tables et de colonnes que j'avais spécifiés via les attributes.

Je ne m'attendais pas à cet échec des attributes explicites du Code First. Est-ce que quelqu'un a une idée pourquoi cela ne fait pas ce que je veux, ou comment le réparer? (Dois-je faire quelque chose pour spécifier les noms de table et de colonne dans OnModelCreating ainsi que – ou au lieu de – les attributes?)

Notez que le projet dans lequel j'ai copié ces classs n'avait jamais "vu" la database auparavant. Il n'y a pas de vestiges de «templates» restants de l'outillage ayant regardé la database. Aussi, j'espère que cela n'a pas d'importance que j'ai essayé de garder les choses sur Net 4.0 (en évitant d'aller à 4.5 dans ce code).

Toute aide serait appréciée.

Je ne suis pas non plus un grand fan de DataAnotations. Utilisez EntityTypeConfiguration. Il vous donne la flexibilité de nommage que je pense que vous searchz.

Exemple.

 public class PhoneData { public int ID {get;set;} public ssortingng SomeProperty {get;set;} } public class PhoneDataMap : EntityTypeConfiguration<PhoneData> { public PhoneDataMap() { ToTable("WhatEverYou_Want_to_call_this"); HasKey(m => m.Id); Property(m => m.SomeProperty).HasColumnName("whatever").IsRequired(); //etc. } } 

Puis dans votre sur ModelCreating vous ajoutez

 modelBuilder.Configuration.Add(new PhoneDataMap()); 

D'un autre côté, si vous rencontrez des problèmes avec la pluralisation de vos noms de tables, vous pouvez également append ceci à OnModelCreating.

 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();