【问题标题】:Entity Framework Code First - MySQL - error can't find table实体框架代码优先 - MySQL - 错误找不到表
【发布时间】:2012-02-07 22:15:36
【问题描述】:

我是 EF、EF Code First 和 EF with MySQL 的新手。 EF Code First 何时会在 ASP.NET MVC Web 项目中创建您的表?

我创建了一个 Person 模型。然后生成控制器和标准视图。 当我点击 Person 控制器的 Index 方法时,它会尝试拉回所有人员的列表。然后我得到错误:
执行命令定义时发生错误。有关详细信息,请参阅内部异常。
内部异常:
表 'testmvc.people' 不存在

所以我已经通过了连接。但是没有创建表。如何创建表格?另外如何防止命名方案中的人对人的复数?

【问题讨论】:

    标签: mysql entity-framework entity-framework-4.1 ef-code-first


    【解决方案1】:

    生成数据库模式(人员表和其他)的最简单方法是设置数据库初始化策略,如下所示:

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

    此代码需要在您尝试加载任何数据之前运行,因此 Global.asax 中的 Application_Start() 方法将是执行此操作的好地方。有几种初始化方法,因此您可能需要在选择一种之前先查看它们,请参阅http://msdn.microsoft.com/en-us/library/system.data.entity%28v=vs.103%29.aspx 并查看实现 IDatabaseInitializer 的方法。官方默认有一个策略,虽然我从来没有完全找到适合我的策略。

    您还应该注意,虽然此方法非常适合原型设计和开发,但您不能完全将其用于具有实时数据的生产数据库,因为数据库首先会被删除然后重新创建。那时还有其他方法可以做到这一点 - 请参阅 Database migrations for Entity Framework 4 了解可能性。

    关于使用非复数表名的其他问题,有几种方法可以做到这一点。一种方法是像这样注释 Person 类:

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

    要一次为所有表设置此项,您可以使用 fluent API,如下所示:

    class SomeContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {    
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
    

    【讨论】:

    • 那么没有“AlaysUpdate”选项吗?像只知道如何添加表格和字段的人(一种非破坏性选项)?
    • 不幸的是,从 EF 4.2 开始,没有用于非破坏性更新的内置选项。有一个 NuGet 包可用,称为 EntityFramework.Migrations 可以帮助您(仍处于测试阶段),它应该包含在 EF 4.3 中(目前也处于测试阶段)。您可以使用的另一个附加选项是 RoundhouseE - github.com/chucknorris/roundhouse,尽管我不确定它的维护情况如何。我个人推出了自己的迁移控制系统,尽管我期待 EF 4.3 版本的此功能。
    【解决方案2】:

    带有实体框架的 MySql 需要一些小调整。您需要创建三个类(您可以查看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 类

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

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 2011-11-03
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多