使用Identity 2的EF6和MySql的ASP.NET MVC 5.我已经做了类似DBA的'bigdata'已经很多年了,现在我又回到了代码之中 . 我理解EF作为一种架构,但我在为我的项目奠定了底层,特别是MySql皱纹时缺乏专业知识 .
我成功完成的任务:使用MySQLConfiguration,MySqlHistoryContext和MySqlInitializer创建项目,运行迁移以成功创建Identity表,将站点部署到本地服务器并成功注册用户并登录 . 很棒!
问题:我失去了如何管理两个上下文,合并上下文,什么应该是我的最佳实践,因此我可以继续扩展Identity对象并通过POCO模型添加新的数据库表并迁移到同一个数据库并让它们工作通过控制器的上下文 .
指导会很有帮助 . 我相信我的问题在于创建第二个上下文,我更喜欢使用相同的连接 .
附件是来自其他教程和参考的我的类mod .
如何创建一个新的上下文,它将使用迁移从POCO模型创建一个新表?
public class ApplicationDbContext : IdentityDbContext
{
static ApplicationDbContext()
{
Database.SetInitializer(new MySqlInitializer());
}
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
网上的一些评论表明不需要MySqlInitializer . 我硬编码了db名称,所以简单地“让它工作” .
public class MySqlInitializer : IDatabaseInitializer
{
public void InitializeDatabase(ApplicationDbContext context)
{
if (!context.Database.Exists())
{
context.Database.Create();
}
else
{
var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery(
string.Format("SELECT COUNT(*) FROM [hardcodeddbname].__MigrationHistory"));
if (migrationHistoryTableExists.FirstOrDefault() == 0)
{
context.Database.Delete();
context.Database.Create();
}
}
}
}
public class MySqlConfiguration : DbConfiguration
{
public MySqlConfiguration()
{
SetHistoryContext(
"MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema));
}
}
public class MySqlHistoryContext : HistoryContext
{
public MySqlHistoryContext(
DbConnection existingConnection,
string defaultSchema)
: base(existingConnection, defaultSchema)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity().Property(h => h.MigrationId).HasMaxLength(100).IsRequired();
modelBuilder.Entity().Property(h => h.ContextKey).HasMaxLength(200).IsRequired();
}
}