2010-08-30 16 views
6

Mi nombre de entidad es "Contacto" y el nombre de mi tabla es "Contacto". Sin embargo, el soporte de pluralización predeterminado es hacer que EF4 busque una tabla llamada "Contactos". ¿Alguien tiene alguna idea sobre cómo desactivar el soporte de pluralización?Entity Framework - CTP4 - Primero el código - ¿Cómo desactivar la pluralización automática?

This publicación tiene algunos detalles sobre el soporte de pluralización. Pero aún no me da una respuesta.

Veo el siguiente texto en la publicación this. Antes que nada, no sé qué archivo .tt físico necesito para hacer este cambio. Además, quiero que esta característica se desactive solo para una aplicación y no para todas.

El generador de código en la caja de herramientas T4 tiene la pluralización activada de forma predeterminada en Visual Studio 2010. Si necesita generar el DAL sin pluralización, tal vez por razones de compatibilidad , puede activar esta opción apagado agregando la siguiente línea al archivo .tt antes de generador. Se llama al método Run().

C#
generator.Pluralize = false;

VB
generator.Pluralize = False

***** ***** ACTUALIZACIÓN

A continuación se presenta el código que utilizo y me sale un error dada a continuación: -

Contacto

public class Contact 
{ 
public int ContactID { get; set; } 
public string FirstName { get; set; } 
public string LastName { get; set; } 
public string Title { get; set; } 
public DateTime AddDate { get; set; } 
public DateTime ModifiedDate { get; set; } 
} 

Contexto: -

public class AddressBook : DbContext 
{ 
public DbSet<Contact> Contact { get; set; } 

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Contact>().MapSingleType().ToTable("dbo.Contact"); 
} 

}

El programa principal: -

using (var context = new AddressBook()) 
    { 
    var contact = new Contact 
    { 
    ContactID = 10000, 
    FirstName = "Brian", 
    LastName = "Lara", 
    ModifiedDate = DateTime.Now, 
    AddDate = DateTime.Now, 
    Title = "Mr." 

    }; 
    context.Contact.Add(contact); 
    int result = context.SaveChanges(); 
    Console.WriteLine("Result :- " + result.ToString()); 

    } 

Y me sale el siguiente error en "context.Contact.Add (contacto);": -

Sistema .InvalidOperationException: el modelo que respalda el contexto 'AddressBook' ha cambiado desde que se creó la base de datos . O manualmente eliminar/actualizar la base de datos o llamar al Database.SetInitializer con una instancia de IDatabaseInitializer . Para el ejemplo , la estrategia RecreateDatabaseIfModelChanges se eliminará automáticamente y recreará la base de datos y, opcionalmente, la inicializará con los datos nuevos. en System.Data.Entity.Infrastructure.CreateDatabaseOnlyIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Infrastructure.Database.Initialize() at System.Data.Entity.Internal.InternalContext.Initialize() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.EfInternalQuery 1.Initialize() en System.Data.Entity.DbSet 1.ActOnSet(Action action,EntityState newState, TEntity entity) at System.Data.Entity.DbSet 1.Add (TEntity entidad) en CodeFirst.Client.Program.Main (String [] args) en E: \ Ashish \ Research \ VS Solutions \ EntityFramework \ CodeFirstApproach_EF_CTP4 \ CodeFirst.Client \ Program.cs: línea 35

Estoy seguro de que estoy cometiendo un error estúpido en alguna parte, simplemente no puedo entenderlo. ¿Podría alguien dar algunas indicaciones?

RESPUESTA Con la ayuda de Pault que describe este problema y la solución here.

+1

..como nota al margen: en mi opinión, es una buena práctica mantener los nombres de las tablas pluralizados. Representan una colección de entradas, ni una sola. –

+0

+1 Arve, estoy de acuerdo. Sin embargo, puede comprender que no puedo cambiar el nombre de la tabla en una base de datos existente. –

Respuesta

6

Estoy agregando una tercera respuesta a medida que mi comprensión de la pregunta cambia ... ¿es tan malo de mí? ;)

Como dije en mi comentario, todavía estoy aprendiendo y todavía no lo he intentado con una base de datos existente. Dicho esto, con suerte uno de estos ayudará:

La publicación que mencioné por Scott Guthrie (http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx) tiene un comentario de un tal Jeff que dice que esto puede ayudar (recomiendo leer el comentario completo como explica con más detalle) :

Database.SetInitializer<AddressBook>(null); //AddressBook being the context 

también he pasó a través de un comentario por Rowan Miller debajo de este post (http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4announcement.aspx?PageIndex=2) en el pasado reciente. Sugiere que esta podría ser una opción:

public class ProductContext : DbContext 
{ 
    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.IncludeMetadataInDatabase = false; 
    } 
    ... 
} 

Afortunadamente, una de estas opciones lo lleva por el camino correcto.

+0

Right track !!! Database.SetInitializer (nulo) es el camino a seguir. Necesitaba incluir esto como la primera línea en mi programa. ¡Gracias una tonelada! :-) Leí ese artículo, sin embargo, no miré los comentarios. Lección aprendida: Leer comentarios en una gran publicación de blog es útil. –

+0

Me pregunto cómo Scot podría ejecutar la muestra que tiene en la muestra que tiene en http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database -schema-mapping.aspx donde trabaja con una base de datos existente y asigna a una tabla diferente (tblDinners en lugar de Dinners). –

+0

Describí este problema y la solución aquí: - http://ashishrocks.spaces.live.com/blog/cns!BED6CE34F24CB429!540.entry –

2

¿Estás tratando de apuntar a un nombre de tabla en particular?

Si es así, esto puede ser la respuesta que buscas:

public class FooDataContext : DbContext 
{ 
    public DbSet<Contact> Contacts { get; set; } 
} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Contact>().MapSingleType().ToTable("Contact"); 
    } 
} 

hace esto ayuda o me he perdido por completo el punto?

+0

Gracias por su tiempo. Sí, intento apuntar a un nombre de tabla particular (que no es plural en este caso). Estoy usando un código muy similar al que sugirió y recibí un error. Ver mi pregunta actualizada –

0

Fuera de la caja, el código primero no modificará ni eliminará una base de datos existente. Supongo que tienes una base de datos existente que creaste manualmente o la que creaste al ejecutar tu programa antes, y luego cambiaste tu clase de contacto. La forma más rápida de corregir este error una vez sería eliminar manualmente su base de datos o actualizarla para que coincida con su modelo.

Sin embargo, la potencia real del conjunto de características de primer código es permitir la rápida creación y refactorización de dominios sin tener que preocuparse por crear y mantener las secuencias de comandos de base de datos al principio del desarrollo. Para hacer esto, personalmente considero útil permitir que el marco elimine mi base de datos cada vez que realizo un cambio en el modelo. Por supuesto, eso también significa que me gustaría sembrar la base de datos con datos de prueba.

Aquí es cómo se puede lograr esto:

public class MyCustomDataContextInitializer : RecreateDatabaseIfModelChanges<MyCustomDataContext> //In your case AddressBook 
{ 
    protected override void Seed(MyCustomDataContext context) 
    { 
     var contact = new Contact 
     { 
      ContactID = 10000, 
      FirstName = "Brian", 
      LastName = "Lara", 
      ModifiedDate = DateTime.Now, 
      AddDate = DateTime.Now, 
      Title = "Mr." 
     }; 
     context.Contact.Add(contact); 
     context.SaveChanges(); 
    } 
} 

Luego hay que registrar este inicializador (digamos en Application_Start(), si se trata de una aplicación web):

Database.SetInitializer(new MyCustomDataContextInitializer()); 

Tenga en cuenta que Necesitará:

using System.Data.Entity.Infrastructure; 

¿Le sirve de ayuda?

+0

Paul, tengo una base de datos existente y estoy diseñando un modelo de objetos a su alrededor. Entonces, primero creé mis POCO y pensé en usar el código primero y golpear esta pared. ¿El código primero no es el camino a seguir en este caso? Si es así, ¿por qué estoy recibiendo este error? Si no, ¿cuál es la mejor manera en este caso? –

+0

Bueno, todavía estoy aprendiendo esto, por lo que no estoy completamente seguro de los detalles de hacerlo con una base de datos existente. Dicho esto, Scott Gu tiene una publicación en el blog sobre el tema: http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database. aspx – ptrandem

4
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>(); 
     base.OnModelCreating(modelBuilder); 
    } 
0
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>(); 
    } 
Cuestiones relacionadas