33

Je suis en train de faire une fissure au code de l'infrastructure d'abord. Suite à leur convention de nommage, nous devons maintenant nommer nos tables au pluriel pour ne pas avoir à intervenir avec l'outil. Je sais que les mappings peuvent être sur pilotis. Ma question est la suivante: après des années de suivi de la convention de nommage singulière, est-ce que nous revenons à utiliser plusieurs noms?Entity Framework Code Premières conventions de dénomination - retour à plusieurs noms de tables?

Aussi, je me demandais pourquoi les nouveaux exemples utilisaient Northwind au lieu de Adventure Works. Je pense que la raison est parce que AW utilise la dénomination singulière et ils ne seraient pas en mesure de montrer le pas de code dispose

Répondre

68

La version RTM du premier code sera entièrement en charge une fonctionnalité froide, appelée Conventions Pluggable où vous pouvez ajouter ou remplacer les conventions par défaut telles que celle que vous avez mentionnée.

Heureusement, ce que vous cherchez est déjà inclus dans CTP5. Vous pouvez désactiver la convention des noms de table pluralistes en supprimant la convention PluralizingTableNameConvention. Tout cela est le code que vous devez écrire pour cette question:

using System.Data.Entity.ModelConfiguration.Conventions.Edm.Db; 

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{  
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
} 


A propos de vos questions Secound, la raison pour laquelle vous plus voir la base de données Northwind que Adventure Works est juste parce que AW est un énorme et Northwind est assez petite base de données font donc un meilleur ajustement pour les échantillons et les procédures pas à pas. Cela dit, vous devez toujours écrire du code pour travailler avec la base de données Northwind dans Code First.

+0

Je savais que je pouvais remplacer les conventions avec quelque chose comme modelBuilder.Entity (). ToTable ("ApplicationUser") ;. Je me demande simplement si le nommage singulier des tables est toujours le "in" chose. –

+0

Ce que vous avez dit utilise couramment API et ce n'est * PAS * ce que je voulais dire par * désactiver les conventions *. Nous pouvons simplement désactiver une convention * entièrement * pour notre application par * conventions enfichables *. J'ai mis à jour ma réponse pour clarifier. –

+2

Merci pour la clarification et l'exemple. J'ai l'impression de boire un feu entre EF CodeFirst et MVC 3! –

1

J'ai essayé et est comme EF4 CTP5 l'ignore totalement. Qu'est-ce qui peut être mauvais?

section en utilisant:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using System.Data.Entity; 
using System.Data.Entity.ModelConfiguration; 
using System.Data.Entity.ModelConfiguration.Conventions.Edm; 

DbContext:

public class SiteDataContext : DbContext 
    { 
     public DbSet<Blog> Blogs { get; set; } 
     public DbSet<BlogFeedback> BlogFeedbacks { get; set; } 
     public DbSet<BlogCategoryList> BlogCategoryLists { get; set; } 
     public DbSet<BlogCategory> BlogCategories { get; set; } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>(); 
      base.OnModelCreating(modelBuilder); 
     } 
    } 

cours POCO

public class Blog 
    {...} 
public class BlogFeedback 
    {...} 
public class BlogCategoryList 
    {...} 
public class BlogCategory 
    {...} 

tables générées:

Blogs 
BlogCategories 
BlogCategoryLists 
BlogFeedbacks 

Ce que je besoin:

Blog 
BlogCategory 
BlogCategoryList 
BlogFeedback 

Une chose peut être différent est que je partage mon solution dans deux projets de base et sur le Web. Le noyau a des modèles, des services et tout le code d'abord. Web a seulement des contrôleurs et des vues et une référence à Core. Le SetInitializer(). Seed() est à l'intérieur d'une fonction dans Core, et dans Web global.asax, le Core.SetInitializer est appelé, donc gardez toutes les fonctions CTP5 dans Core. La base de données est en cours de recréation ok, les données sont remplies ok, juste la convention conserve les noms de tables PLURAL, ignorant le remplacement de modelBuilder

+0

J'ai exactement le même problème. Avez-vous trouvé une solution? – 0xbadf00d

+3

Oui, j'ai mal orthographié et utilisé une mauvaise convention constante. Assurez-vous que vous utilisez "PluralizingTableNameConvention" au lieu de "PluralizingEntitySetNameConvention" – Nestor

+0

Dommage, je suis déjà en train d'utiliser le bon. Je ne sais pas pourquoi c'est ignoré. – 0xbadf00d

2

voici un extrait du code que j'utilise et qui fonctionne à 100%. Essayez copier et coller et essayez-le, il doit créer des noms de table de noms singuliers. J'utilise EF4.1 et CE4.0

POCO classe

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 

namespace CloudOne.Models 
{ 
    public class Brand 
    { 
     public int BrandID { get; set; } 
     [MaxLength(25)] 
     [Required] 
     public string BrandName { get; set; } 
     [MaxLength(1000)] 
     public string BrandDescription { get; set; } 
     public int SortOrder { get; set; } 
     //SEO 
     [MaxLength(70)] 
     public string PageTitle { get; set; } 
     [MaxLength(100)] 
     public string MetaDescription { get; set; } 
     [MaxLength(150)] 
     public string MetaKeywords { get; set; } 
     [MaxLength(56)] //50 + "-" + 99,000 
     public string Slug { get; set; } 
    } 
} 

données Contexte

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Data.Entity.ModelConfiguration.Conventions; 

namespace CloudOne.Models 
{ 
    public class SiteDataContext: DbContext 
    { 
     public DbSet<Brand> Brands { get; set; } 

     // Twist our database 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
      base.OnModelCreating(modelBuilder); 
     } 
    } 
} 

La graine initialiseur

public class SiteDataContextInitializer: DropCreateDatabaseIfModelChanges<SiteDataContext> 
    { 
     protected override void Seed(SiteDataContext context) 
     { 
      var brands = new List<Brand>() 
      { 
       new Brand { BrandName = "Brand 1", Slug = "brand-1" }, 
       new Brand { BrandName = "Brand 2", Slug = "brand-2" } 
      }; 

      brands.ForEach(d => context.Brands.Add(d)); 

      base.Seed(context); 
     } 
    } 

Essayez de copier et coller ce code, puis d'écrire un code pour déclencher la création de bases de données (c'est-à-dire essayer d'aller chercher les enregistrements et les montrer dans la page d'index).

Questions connexes