Entity Framework crea un nome di tabella plurale, ma la vista si aspetta un nome di tabella singolare?

Sto usando MySQL .net connettore 6.4.4.0 e Entity Frame lavoro 4.1 e sto provando a creare la più elementare delle implementazioni code-first.

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

il mio modello

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

il mio controller di casa

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

la mia vista fortemente tipizzata (usando scaffold List)

 @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 i “voti” della tabella in MySQL con tutte le proprietà giuste.

Tuttavia, getta su questa linea:

@ perfora (elemento var nel modello)

con l’eccezione:

“Tabella ‘mydb.vote’ non esiste”

modifica: per chiarire, in realtà desidero la pluralizzazione delle tabelle e sembra che crei correttamente la tabella. Spero di scoprire il motivo della discrepanza singolare / plurale. Nessuna delle esercitazioni e dei video di microsoft / Plural Sight / scott gu gestisce l’uso di mysql, quindi devo immaginare che il .netconnector potrebbe essere il colpevole. Vorrei anche evitare di usare gli attributi [Tabella (“Voti”)]. Fondamentalmente spero in una soluzione il più ansible “pronta per l’uso”.

edit2 (qualche altro codice rilevante): quando rimuovo questo … le tabelle non riescono a creare tutto insieme. ma la vista getta un’eccezione alla ricerca di “voti” e non di “voti”. all’interno di 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); } } 

Così ho rinunciato a provare a farlo nel modo in cui sentivo che doveva essere fatto e rimosso la pluralizzazione tutti insieme. Non lo so per certo, ma suppongo che il problema abbia a che fare con il supporto del connettore mysql .net di EF. Ecco cosa ho fatto.

Innanzitutto, c’era un bug nel mio metodo ApplicationStart:

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

In secondo luogo, ho smesso di chiamare l’implementazione di base OnModelCreating che non è elencata nel codice originale poiché l’ho implementata solo come suggerito da jgauffin:

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

In terzo luogo, ho letto in alcuni post che MySQL .net Connector non consente a EF di creare effettivamente un database, quindi ho inizialmente creato il DB vuoto. Questo sembra non essere più il caso con il connettore 6.4.4+, e fintanto che l’utente della stringa di connessione ha la possibilità di creare nuovi database, funziona meglio se inizialmente non ne esiste uno.

Una volta, ho fatto tutto quanto sopra, sembrava funzionare. Quindi ora posso almeno andare avanti. Speriamo di poter capire la causa della discrepanza plurale / singolare in futuro.

Grazie a tutti per il loro tempo e impegno.

Nella tua class di contesto myDB, sostituisci il seguente metodo

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

per fare in modo che non pluralizzi i nomi delle tabelle generate.

Rimuovi il segno di spunta “Pluralizza o singolarmizza i nomi degli oggetti generati” quando crei il tuo object quadro.

inserisci la descrizione dell'immagine qui

Aprire la class DbContext relativa alle tabelle che si desidera mantenere un nome di tabella singolare.

Se stai utilizzando EF 6, aggiungi un riferimento a:

 using System.Data.Entity.ModelConfiguration.Conventions; 

Se è una versione precedente, aggiungi un riferimento a:

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

Infine, crea un metodo che sovrascrive OnModelCreating e rimuovi la convenzione per pluralizzare i nomi delle tabelle:

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

Devi eseguire l’override di OnModelCreating nel tuo DbContext per specificare il nome della tabella:

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

Se stai utilizzando Code First con EF 6.1 +, esegui l’override del gestore di eventi OnModelCreating ed effettua le seguenti chiamate:

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