Entity Framework Code First - MySQL - ошибка не может найти таблицу - PullRequest
5 голосов
/ 11 января 2012

Я новичок в EF, EF Code First и EF с MySQL.Когда EF Code First создаст ваши таблицы в веб-проекте ASP.NET MVC?

Я создал модель Person.Затем генерируется контроллер и стандартные представления.Когда я нажимаю на метод Index контроллера Person, он пытается получить список всех людей.Затем я получаю сообщение об ошибке:
Произошла ошибка при выполнении определения команды.Подробности см. Во внутреннем исключении.
Внутреннее исключение:
Таблица 'testmvc.people' не существует

Так что я прошел мимоподключение.Но стол не был создан.Как мне создать таблицы?Также, как я могу предотвратить плюрализм Person to People в схеме именования?

Ответы [ 2 ]

8 голосов
/ 11 января 2012

Самый простой способ создать схему базы данных (таблица сотрудников и другие) - установить стратегию инициализации базы данных, например:

Database.SetInitializer<SomeContext>( new 
    DropCreateDatabaseAlways<SomeContext>());

Этот код должен быть запущен до того, как вы попытаетесь загрузить какие-либо данные, поэтому метод Application_Start () в Global.asax был бы хорошим местом для этого. Есть несколько способов инициализации, поэтому вы можете взглянуть на них, прежде чем выбрать один, см. http://msdn.microsoft.com/en-us/library/system.data.entity%28v=vs.103%29.aspx и посмотрите на методы, которые реализуют IDatabaseInitializer. Официально, по умолчанию есть стратегия, хотя я так и не нашел, что она мне подходит.

Вы также должны знать, что, хотя этот метод отлично подходит для создания прототипов и разработки, вы не можете использовать его в рабочей базе данных с оперативными данными, поскольку база данных сначала удаляется, а затем воссоздается. Есть и другие способы сделать это на этом этапе - см. Миграции базы данных для Entity Framework 4 , чтобы узнать о возможностях.

Что касается вашего другого вопроса об использовании не множественных имен таблиц, есть несколько способов сделать это. Один из способов - аннотировать класс Person следующим образом:

[Table("Person")]
class Person
{
    // some field attributes
}

Чтобы установить это для всех таблиц одновременно, вы можете использовать свободный API, например:

class SomeContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {    
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}
2 голосов
/ 23 октября 2017

MySql с Entity Framework требует некоторых небольших настроек.Вам нужно создать три класса (вы можете проверить https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/aspnet-identity-using-mysql-storage-with-an-entityframework-mysql-provider для более подробной информации).Сначала создайте класс MySqlHistoryContext .

public class MySqlHistoryContext : HistoryContext
{
  public MySqlHistoryContext(
  DbConnection existingConnection,
  string defaultSchema)
  : base(existingConnection, defaultSchema)
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);
  modelBuilder.Entity<HistoryRow>().Property(h => 
  h.MigrationId).HasMaxLength(100).IsRequired();
  modelBuilder.Entity<HistoryRow>().Property(h => 
  h.ContextKey).HasMaxLength(200).IsRequired();
}

}

Создайте класс MySqlConfiguration далее

public class MySqlConfiguration : DbConfiguration
{
public MySqlConfiguration()
{
  SetHistoryContext(
  "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema));
}

}

СоздатьMySqlInitializer class next

public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext>
{
public void InitializeDatabase(ApplicationDbContext context)
{
  if (!context.Database.Exists())
  {
    // if database did not exist before - create it
    context.Database.Create();
  }
  else
  {
    // query to check if MigrationHistory table is present in the database 
    var migrationHistoryTableExists = 
  ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
      "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 
 'IdentityMySQLDatabase' AND table_name = '__MigrationHistory'");

    // if MigrationHistory table is not there (which is the case first time 
  we run) - create it
    if (migrationHistoryTableExists.FirstOrDefault() == 0)
    {
      context.Database.Delete();
      context.Database.Create();
    }
   }
  }
 }

Откройте IdentityModels.cs в папке модели. Добавьте это в класс ApplicationDbContext: IdentityDbContext

static ApplicationDbContext()
{
  Database.SetInitializer(new MySqlInitializer());
}
...