Entity Framework создает множественное имя таблицы, но представление ожидает уникальное имя таблицы?

Я использую MySQL .net connector 6.4.4.0 и Entity Frame work 4.1 и пытаюсь создать самые простые из кодовых реализаций.

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

моя модель

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

мой домашний controller

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

мое строго типизированное представление (с использованием списка лесов)

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

Он создает таблицу «голосов» в mySQL со всеми подходящими свойствами.

Однако он бросает эту строку:

@foreach (элемент var в модели)

с исключением:

«Таблица« mydb.vote »не существует»

edit: Чтобы уточнить, мне действительно нужна табличная плюрализация, и, похоже, она правильно создает таблицу. Я надеюсь найти причину сингулярного / множественного несоответствия. Ни один из обучающих программ и видео с помощью microsoft / Plural Sight / scott gu не обрабатывает mysql, поэтому я должен предположить, что .netconnector может быть виновником. Я также хотел бы избежать использования атрибутов [Таблица («Голосов»)]. В принципе, я надеюсь на такое «из коробки», насколько это возможно.

edit2 (еще один соответствующий код): когда я удаляю это … таблицы не могут создать все вместе. но вид вызывает исключение, ища «голоса» не «голос». внутри 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); } } 

Поэтому я отказался от попыток сделать это так, как я чувствовал, что это нужно сделать и удалить плюрализацию. Я действительно не знаю наверняка, но я предполагаю, что проблема связана с поддержкой соединителя mysql .net EF. Вот что я сделал.

Во-первых, в моем методе ApplicationStart произошла ошибка:

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

Во-вторых, я перестал использовать базовую реализацию OnModelCreating, которая не указана в исходном коде, поскольку я только реализовал ее в соответствии с предложением jgauffin:

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

В-третьих, я прочитал в некоторых сообщениях, что MySQL .net Connector не позволяет EF фактически создавать CREATE базу данных, поэтому я изначально создал пустую БД. Это, похоже, больше не относится к разъему 6.4.4+, и пока пользователь вашей строки подключения может создавать новые базы данных, он работает лучше, если изначально не существует.

Однажды, я сделал все вышеперечисленное, это, казалось, сработало. Поэтому теперь я могу хотя бы двигаться вперед. Надеюсь, мы сможем выяснить причину множественного / сингулярного несоответствия в будущем.

Спасибо всем за их время и силы.

В вашем classе myDB переопределите следующий метод

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

чтобы он не дублировал имена сгенерированных таблиц.

Удалите флажок «Плюрализировать или сгенерировать сгенерированные объекты», когда вы создаете объект объекта.

введите описание изображения здесь

Откройте class DbContext связанный с таблицами, которые вы хотите сохранить уникальным именем таблицы.

Если вы используете EF 6, добавьте ссылку на:

 using System.Data.Entity.ModelConfiguration.Conventions; 

Если это более старая версия, добавьте ссылку на:

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

Наконец, создайте метод, который переопределяет OnModelCreating и удаляет соглашение для множественного использования имен таблиц:

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

Вы должны переопределить OnModelCreating в своем DbContext, чтобы указать имя таблицы:

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

Если вы используете Code First с EF 6.1 +, переопределите обработчик событий OnModelCreating и выполните следующие вызовы:

 dmbCloud.Conventions.Remove(); dmbCloud.Conventions.Remove(); 
  • MySQL CURRENT_TIMESTAMP для создания и обновления
  • Как я могу «выбрать *» из таблицы в MySQL, но опустить некоторые столбцы?
  • SQL: удаление таблиц с префиксом
  • Консоль администратора Glassfish вызывает java.lang.IllegalStateException при создании пула JDBC
  • MySQL против PostgreSQL? Какой я должен выбрать для своего проекта Django?
  • # 1130 - Host 'localhost' не разрешено подключаться к этому серверу MySQL
  • Что означает ключевое слово KEY?
  • Нормализация в MYSQL
  • mysql PDO, как связать LIKE
  • Выберите mysql-запрос между датой?
  • Восстановить базу данных mysql из файлов .frm
  • Давайте будем гением компьютера.