Entity Framework создает множественное имя таблицы, но представление ожидает уникальное имя таблицы?
Я использую MySQL.net-коннектор 6.4.4.0 и Entity Frame work 4.1 и пытаюсь создать самую основную реализацию кода.
public class myDB: DbContext
{
public DbSet<Vote> Votes { get; set; }
}
моя модель
public class Vote
{
public Guid Id { get; set; }
public int Value { get; set; }
}
мой домашний контроллер
public class HomeController : Controller
{
myDB_db = new myDB();
public ActionResult Index()
{
var model = _db.Votes;
return View(model);
}
}
мой строго типизированный вид (с использованием списка лесов)
@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>
Он создает таблицу "голосов" в mySQL со всеми подходящими свойствами.
Однако он выбрасывает эту строку:
@foreach (элемент var в модели)
за исключением:
"Таблица" mydb.vote "не существует"
изменить:
Чтобы уточнить, я действительно хочу использовать плюрализацию таблиц, и, похоже, она правильно создает таблицу. Я надеюсь найти причину сингулярного/множественного несоответствия. Ни один из учебных пособий и видеороликов из microsoft/Plural Sight/scott gu не обрабатывает mysql, поэтому я должен представить себе, что .netconnector может быть виновником. Я также хотел бы избежать использования атрибутов [Таблица ( "Голосов" )]. В принципе, я надеюсь на как можно больше "из коробки".
edit2 (более подходящий код):
когда я удаляю это... таблицы не могут создать все вместе.
но вид вызывает исключение, ища "голоса" не "голос".
в 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);
}
}
Ответы
Ответ 1
Поэтому я отказался от попыток сделать это так, как я чувствовал, что это нужно сделать и удалить плюрализацию все вместе. Я действительно не знаю наверняка, но я предполагаю, что проблема связана с поддержкой соединителя mysql.net EF. Вот что я сделал.
Во-первых, в моем методе ApplicationStart произошла ошибка:
//WRONG
//Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());
Database.SetInitializer(new myDBInitializer());
Во-вторых, я перестал использовать базовую реализацию OnModelCreating, которая не указана в исходном коде, так как я только реализовал ее в соответствии с предложением jgauffin:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//DONT DO THIS ANYMORE
//base.OnModelCreating(modelBuilder);
//modelBuilder.Entity<Vote>().ToTable("Votes")
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
В-третьих, я прочитал в некоторых сообщениях, что MySQL.net Connector не позволяет EF на самом деле CREATE базе данных, поэтому я изначально создал пустой БД. Это, похоже, больше не имеет отношения к разъему 6.4.4+, и пока пользователь вашей строки подключения имеет возможность создавать новые базы данных, он работает лучше, если изначально не существует.
Однажды, я сделал все вышеперечисленное, это, казалось, сработало. Поэтому теперь я могу хотя бы двигаться вперед. Надеюсь, мы сможем выяснить причину множественного/сингулярного несоответствия в будущем.
Спасибо всем за их время и силы.
Ответ 2
В вашем классе контекста myDB переопределите следующий метод
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
}
чтобы он не дублировал имена сгенерированных таблиц.
Ответ 3
Удалите флажок "Плюрализировать или сингулярно сгенерированные имена объектов" при создании объекта сущности.
![enter image description here]()
Ответ 4
Откройте класс 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<PluralizingTableNameConvention>();
}
Ответ 5
Вам необходимо переопределить OnModelCreating в вашем DbContext, чтобы указать имя таблицы:
modelBuilder.Entity<Vote>().MapSingleType().ToTable("Votes")
Ответ 6
Если вы используете Code First с EF 6.1 +, переопределите обработчик событий OnModelCreating и выполните следующие вызовы:
dmbCloud.Conventions.Remove<PluralizingEntitySetNameConvention>();
dmbCloud.Conventions.Remove<PluralizingTableNameConvention>();