Entity Framework crea un nombre de tabla plural, pero la vista espera un nombre de tabla singular?

Estoy usando MySQL .NET connector 6.4.4.0 y Entity Frame work 4.1 e bash crear las implementaciones más básicas de primer código.

public class myDB: DbContext { public DbSet Votes { get; set; } } 

mi modelo

 public class Vote { public Guid Id { get; set; } public int Value { get; set; } } 

mi controlador de casa

 public class HomeController : Controller { myDB_db = new myDB(); public ActionResult Index() { var model = _db.Votes; return View(model); } } 

mi vista fuertemente tipada (usando andamio de lista)

 @model IEnumerable @{ ViewBag.Title = "Index"; } 

Index

@Html.ActionLink("Create New", "Create")

@foreach (var item in Model) { }
@Html.DisplayNameFor(model => model.Value)
@Html.DisplayFor(modelItem => item.Value) @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | @Html.ActionLink("Details", "Details", new { id=item.Id }) | @Html.ActionLink("Delete", "Delete", new { id=item.Id })

Crea la tabla ‘votos’ en mySQL con todas las propiedades correctas.

Sin embargo, arroja a esta línea:

@foreach (elemento var en Modelo)

con la excepcion:

“Table ‘mydb.vote’ no existe”

editar: para aclarar, realmente quiero la pluralización de tablas, y parece crear correctamente la tabla. Espero descubrir el motivo de la discrepancia singular / plural. Ninguno de los tutoriales y videos de microsoft / Plural Sight / scott gu manejan usando mysql, así que tengo que imaginarme que el .netconnector podría ser el culpable. También me gustaría evitar el uso de los atributos [Table (“Votes”)]. Básicamente, espero la mayor cantidad posible de soluciones “listas para usar”.

edit2 (algún código más relevante): cuando elimino esto … las tablas no pueden crearse todas juntas. pero la vista arroja una excepción buscando ‘votos’, no ‘voto’. dentro de global.asax

 protected void Application_Start() { Database.SetInitializer(new DropCreateDatabaseAlways()); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } public class myDBInitializer : DropCreateDatabaseAlways { protected override void Seed(myDBcontext) { base.Seed(context); } } 

Así que dejé de tratar de hacerlo de la manera que sentía que debería hacerse y eliminé la pluralización todos juntos. Realmente no lo sé con certeza, pero supongo que el problema tiene que ver con el soporte del conector mysql .net de EF. Aquí esta lo que hice.

Primero, hubo un error en mi método ApplicationStart:

 //WRONG //Database.SetInitializer(new DropCreateDatabaseAlways()); Database.SetInitializer(new myDBInitializer()); 

En segundo lugar, dejé de llamar a la implementación base de OnModelCreating, que no figura en el código original, ya que solo lo implementé según la sugerencia de jgauffin:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { //DONT DO THIS ANYMORE //base.OnModelCreating(modelBuilder); //modelBuilder.Entity().ToTable("Votes") modelBuilder.Conventions.Remove(); } 

Tercero, leí en algunas publicaciones que el Conector .NET de MySQL no permite que EF realmente CREA una base de datos, así que inicialmente había creado el DB en blanco. Parece que ya no es el caso con el conector 6.4.4+, y siempre que el usuario de su cadena de conexión tenga la capacidad de crear nuevas bases de datos, funciona mejor si no existe inicialmente.

Una vez, hice todo lo anterior, parecía funcionar. Así que ahora puedo al menos seguir adelante. Con suerte, podemos descubrir la causa de la discrepancia plural / singular en el futuro.

Gracias a todos por su tiempo y esfuerzo.

En su clase de contexto myDB, anule el siguiente método

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

tenerlo no pluralizar los nombres de tabla generados.

Quite la marca de verificación “Pluralizar o generar nombres de objetos generados por singularización” cuando cree su objeto de entidad.

enter image description here

Abra la clase DbContext relacionada con las tablas en las que desea mantener un nombre de tabla singular.

Si está utilizando EF 6, agregue una referencia a:

 using System.Data.Entity.ModelConfiguration.Conventions; 

Si es una versión anterior, agregue una referencia a:

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

Por fin crea un método que anula OnModelCreating y elimina la convención para pluralizar nombres de tabla:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); } 

Debe sobrescribir OnModelCreating en su DbContext para especificar el nombre de la tabla:

 modelBuilder.Entity().MapSingleType().ToTable("Votes") 

Si está utilizando Code First con EF 6.1 +, anule el controlador de eventos OnModelCreating y realice las siguientes llamadas:

 dmbCloud.Conventions.Remove(); dmbCloud.Conventions.Remove();