4

我新的EF,EF代码首先,和EF与MySQL。什么时候EF Code First会在ASP.NET MVC Web项目中创建您的表格?实体框架代码优先 - MySQL的 - 错误无法找到表

我创建了一个Person模型。然后生成Controller和标准视图。 当我点击人员控制器的索引方法时,它会尝试撤回所有人员的列表。然后,我得到的错误:在执行命令定义时
错误。详情请参阅内部例外。
内部异常:
表“testmvc.people”不存在

所以我做了它过去的连接。但桌子没有创建。我如何创建表格?另外,如何防止命名方案中的Person to People复数化?

回答

8

生成数据库模式(people表等)的最简单方法是设置数据库初始化策略是这样的:

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 
} 

要设置这一次为所有表,您可以用流利的API,像这样:

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

那么,有没有“AlaysUpdate”选项?就像只知道如何添加表格和字段(非破坏性选项)的人一样? – BuddyJoe 2012-01-13 21:12:20

+1

不幸的是,从EF 4.2开始,没有任何烘焙选项用于非破坏性更新。有一个NuGet包可用,称为EntityFramework.Migrations,可以帮助你(仍然在测试版),它应该包含在EF 4.3(目前也在测试版)中。您可以使用的另一个附加选项是RoundhousE - https://github.com/chucknorris/roundhouse,尽管我不确定它的维护情况。我个人推出了自己的迁移控制系统,尽管我期待着EF 4.3发布此功能。 – PinnyM 2012-01-15 03:31:43

+0

很酷。谢谢。 +1 – BuddyJoe 2012-01-16 20:39:11

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

}

创建未来

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在MO MySqlInitializer类del文件夹。这增加了ApplicationDbContext:IdentityDbContext类

static ApplicationDbContext() 
{ 
    Database.SetInitializer(new MySqlInitializer()); 
} 
相关问题