33

Solo estoy tomando una brecha en el código de entidad de marco primero. Siguiendo su convención de nombres, ahora debemos nombrar nuestras tablas en plural para no tener que intervenir con la herramienta. Sé que las asignaciones pueden ser sobrellevadas. Mi pregunta es, después de años de seguir la convención de nomenclatura singular, ¿volvemos a usar nombres en plural?Código del Entidad Framework Primeras convenciones de nomenclatura - volviendo a los nombres de tabla plural?

Además, me preguntaba por qué los nuevos ejemplos usaban Northwind en lugar de Adventure Works. Estoy pensando que la razón es porque AW utiliza denominación singular y que no sería capaz de mostrar el código de cuenta sin

Respuesta

68

La versión RTM de Primera Código apoyará plenamente una función interesante llamado convenios enchufables, donde puede agregar o reemplazar las convenciones predeterminadas como la que mencionó.

Afortunadamente, lo que está buscando ya está incluido en CTP5. Puede desactivar la convención de nombres de tabla de pluralización con la eliminación de la convención PluralizingTableNameConvention. Esto es todo el código que necesita escribir para este asunto:

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

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


Sobre sus preguntas secound, la razón por la que más se ve la base de datos Northwind de Adventure Works es sólo porque AW es una enorme y Neptuno es bastante pequeña la base de datos por lo tanto es más adecuada para muestras y Tutoriales. Dicho esto, aún necesita escribir un código para trabajar con la base de datos Northwind en Code First.

+0

Sabía que podía anular las convenciones con comething como modelBuilder.Entity (). ToTable ("ApplicationUser") ;. Me pregunto si el nombramiento singular de tablas sigue siendo el elemento "en". –

+0

Lo que dijiste es usar una API fluida y eso es * NO * lo que quise decir * desactivando las convenciones *. Podemos desactivar una convención * completamente * para nuestra aplicación mediante * Convenciones conectables *. Actualicé mi respuesta para aclarar. –

+2

Gracias por la aclaración y el ejemplo. ¡Siento que estoy bebiendo de un firehose entre EF CodeFirst y MVC 3! –

1

Lo he intentado y es como EF4 CTP5 lo está ignorando por completo. ¿Qué puede estar mal?

utilizando la sección:

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

POCO clases

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

tablas generadas:

Blogs 
BlogCategories 
BlogCategoryLists 
BlogFeedbacks 

lo que necesito:

Blog 
BlogCategory 
BlogCategoryList 
BlogFeedback 

Una cosa puede ser diferente es divido mi solución en dos proyectos básicos y Web. Core tiene Modelos, Servicios y todo el Código Primero. La web solo tiene controladores y vistas, y una referencia a Core. SetInitializer(). Seed() está dentro de una función en Core, y en Web global.asax se llama al Core.SetInitializer, así que mantenga todas las funciones CTP5 dentro de Core. La base de datos se está recreando bien, los datos se rellenan bien, solo la convención mantiene NOMBRES DE TABLAS PLURALES, ignorando el reemplazo de modelBuilder

+0

Tengo exactamente el mismo problema. ¿Has encontrado una solución? – 0xbadf00d

+3

Sí, escribí mal y utilicé la constante de la convención equivocada. Asegúrese de estar utilizando "PluralizingTableNameConvention" en lugar de "PluralizingEntitySetNameConvention" – Nestor

+0

Lástima, ya estoy usando el correcto. No tengo idea de por qué es ignorado. – 0xbadf00d

2

aquí hay un extracto del código que estoy usando y está funcionando al 100%. Intenta copiar y pegar y pruébalo; debe crear nombres de tablas de nombres singulares. Estoy usando EF4.1 y CE4.0

POCO clase

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

Contexto de datos

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 Semilla inicializador

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

intenta copiar y pegar este código, a continuación, escribir algo de código para activar la creación de bases de datos (es decir, intente buscar los registros y mostrarlos en la página de índice).

Cuestiones relacionadas