Entity Framework crée un pluriel nom de la table, mais la vue s'attend à un singulier nom de la table?
Je suis de l'utilisation de MySQL .net connecteur 6.4.4.0 et Entité Cadre de travail 4.1 et essayer de créer les plus élémentaires de code-premières mises en œuvre.
public class myDB: DbContext
{
public DbSet<Vote> Votes { get; set; }
}
mon modèle
public class Vote
{
public Guid Id { get; set; }
public int Value { get; set; }
}
ma maison contrôleur
public class HomeController : Controller
{
myDB_db = new myDB();
public ActionResult Index()
{
var model = _db.Votes;
return View(model);
}
}
ma fortement typé de vue (à l'aide de la Liste d'échafaudage)
@model IEnumerable<Namespace.Models.Vote>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Value)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Value)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>
Il crée la table "voix" dans mySQL avec toutes les bonnes propriétés.
Cependant, il jette à cette ligne:
@foreach (var élément dans le Modèle)
à l'exception:
"Tableau" mydb.vote "n'existe pas"
edit:
Pour clarifier, je veux en fait la table de la pluralisation, et il semble pour créer correctement le tableau. Je suis l'espoir de découvrir la raison pour laquelle le singulier/pluriel, à la contradiction. Aucun des tutoriels et des vidéos à partir de microsoft /Pluriel Vue /scott gu poignée à l'aide de mysql, j'ai donc imaginer que l' .netconnector pourrait être le coupable. Je voudrais aussi éviter d'utiliser le [Tableau("Voix")] attributs. Fondamentalement, je suis en espérant que beaucoup de "hors de la boîte" solution possible.
edit2 (certains plus pertinents du code):
quand je supprimer ce...tables ne parviennent pas à créer tous ensemble.
mais le point de vue déclenche une exception à la recherche pour les "voix" et non pas "voter".
au sein de global.asax
protected void Application_Start()
{
Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
public class myDBInitializer : DropCreateDatabaseAlways<myDB>
{
protected override void Seed(myDBcontext)
{
base.Seed(context);
}
}
- L'utilisation du
Table
attribut résoudre le problème? Vous pouvez également utiliser l'API fluent si vous n'aimez pas l'attribut. Avez-vous essayé avec SQL Express? Peut-être il ya un problème avec le connecteur MySQL - je fait juste essayé d'ajouter [Table("Voix")] ci-dessus, le Vote de la classe, et le problème persiste. et non, je n'ai pas essayé avec SQLExpress parce que j'ai besoin pour le faire fonctionner avec mysql 🙂
- ps. la table d'attribut a la valeur de Vote, résout le problème. Pourquoi la vue s'attendre à la mauvaise table nom!!!!?? 🙁
- Je ne sais pas MySQL, donc je ne peux que vous demander si vous êtes sûr à 100% que la table dans MySQL est appelé "voix" et non pas "voter"
- yep, juste connecté sur le serveur et vérifié les db. certainement nommé 'voix'.
- Si elle n'est pas trop tard, j'ai entendu parler de notre administrateur local et de lire qu'il est bon DB pratique de conserver les noms de table singulier.
Vous devez vous connecter pour publier un commentaire.
Donc j'ai renoncé à essayer de faire ce que j'ai ressenti cela doit être fait et supprimé la pluralisation tous ensemble. Je ne sais pas vraiment pour certains, mais je suppose que le problème a à voir avec la base de données mysql .net du connecteur de support de EF. Voici ce que j'ai fait.
Tout d'abord, il y avait un bug dans mon ApplicationStart méthode:
Deuxième, j'ai cessé d'appeler le OnModelCreating de la base de la mise en œuvre qui n'est pas inscrite dans le code d'origine depuis que j'ai seulement mis en œuvre comme par jgauffin suggestion:
Troisième, j'ai lu dans certains posts que le MySQL .net Connecteur de ne pas laisser l'EF en fait de CRÉER une base de données, de sorte que j'avais d'abord créé le vide DB. Ce ne semble plus être le cas avec connecteur 6.4.4+, et aussi longtemps que votre chaîne de connexion de l'utilisateur a la possibilité de créer de nouvelles bases de données, il fonctionne mieux si l'on n'est pas en vigueur initialement.
Une fois, j'ai fait tout ce qui précède, il a semblé fonctionner. Alors maintenant, je peux au moins aller de l'avant. J'espère que nous pourrons trouver la cause du pluriel /singulier décalage dans l'avenir.
Merci à tous pour leur temps et leurs efforts.
Can't create table 'yourdb.#sql-440_4fa8' (errno: 150)
, cela signifie que vous avez oublié de retirer leTableAttribute
sur l'un de vos modèles (erreur 150 est clé étrangère de la relation).Dans votre myDB contexte de classe, remplacer la méthode suivante
pour l'avoir, non au pluriel la table des noms.
Ouvrir le
DbContext
de la classe pour les tables que vous voulez garder un singulier nom de la table.Si vous utilisez EF 6, ajouter une référence à:
Si c'est une ancienne version, ajouter une référence à:
Enfin créer une méthode qui remplace la
OnModelCreating
et retirez la convention de pluraliser les noms de table:Supprimer "au pluriel ou singularsize les noms d'objets générés" coche lorsque vous créez votre objet entité.
Vous avez besoin de remplacer OnModelCreating dans votre DbContext pour spécifier le nom de la table:
Si vous êtes en utilisant le Premier Code avec EF 6.1 +, remplacer la OnModelCreating gestionnaire d'événement et de faire l'appel suivant(s):