Подтвердить что ты не робот

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

Ответ 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>();