Entity Framework создает множественное имя таблицы, но представление ожидает единственное имя таблицы? - PullRequest
29 голосов
/ 28 октября 2011

Я использую 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);
    }
}

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

@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 в Model)

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

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

edit: Чтобы уточнить, я на самом деле хочу множественное использование таблиц, и, кажется, правильно создать таблицу.Я надеюсь выяснить причину расхождения в единственном / множественном числе.Ни один из уроков и видео от Microsoft / Plural Sight / Scott Gu не обрабатывает с помощью mysql, поэтому я должен представить, что .netconnector может быть виновником.Я также хотел бы избежать использования атрибутов [Table ("Votes")].По сути, я надеюсь на максимально возможное «готовое» решение.

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

Ответы [ 6 ]

45 голосов
/ 28 октября 2011

Так что я перестал пытаться делать это так, как я чувствовал, что это должно быть сделано, и убрал множественное число все вместе.Я точно не знаю наверняка, но я предполагаю, что проблема связана с поддержкой MyFL .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 фактически СОЗДАТЬ базу данных, поэтому я изначально создал пустую БД.Похоже, что это больше не относится к соединителю 6.4.4+, и пока пользователь вашей строки подключения имеет возможность создавать новые базы данных, он работает лучше, если он изначально не существует.

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

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

20 голосов
/ 28 октября 2011

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

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

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

9 голосов
/ 11 марта 2016

Откройте класс 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>();
}
8 голосов
/ 28 октября 2011

Снимите флажок "Имена сгенерированных или плюрализованных имен объектов" при создании объекта сущности.

enter image description here

3 голосов
/ 27 декабря 2014

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

dmbCloud.Conventions.Remove<PluralizingEntitySetNameConvention>();
dmbCloud.Conventions.Remove<PluralizingTableNameConvention>();
3 голосов
/ 28 октября 2011

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

modelBuilder.Entity<Vote>().MapSingleType().ToTable("Votes")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...