[英]Entity framework with Mysql “model compatibility cannot be checked because the database does not contain model metadata”
Net Asp MVC 5 Web项目,在使用sql server本地db时运行正常。 但是我想迁移到mysql数据库,我知道Entity Framework的主要优点之一是可以使用任何包含连接器的DBMS。
我已按照以下教程使用mySql数据库创建Web项目,但没有结果:
ASP.NET:使用MySQL,Entity Framework 6 Code-First和VS2013建立MVC5网站
如何使用ASP.NET Identity和MySQL Provider设置应用程序
ASP.NET身份:将MySQL存储与EntityFramework MySQL提供程序一起使用
运行我的项目时,我收到此消息:无法检查模型兼容性,因为数据库不包含模型元数据...
我正在使用以下版本的这些工具-Visual Studio 2013更新4-适用于Visual Studio 6.1.3的实体框架工具-实体框架6.1.3-MySQl.Data.Entity 6.9.6-MySql.Data 6.9.6
我的web.config的某些部分
连接字符串:
<connectionStrings>
<add name="DefaultConnection" connectionString="Server=localhost;Database=database;Uid=root;Pwd=root;" providerName="MySql.Data.MySqlClient" />
实体框架:
<entityFramework>
<contexts>
<context type="Tesis.DAL.ApplicationDbContext, Tesis">
<databaseInitializer type="Tesis.DAL.ApplicationInitializer, Tesis" />
</context>
</contexts>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
</provider></providers>
db提供商工厂
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
我的ApplicationDbContext类:
public class ApplicationDbContext : IdentityDbContext<User>
{
public ApplicationDbContext(): base("DefaultConnection", throwIfV1Schema: false)
{
Database.SetInitializer(new MySqlInitializer());
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
public virtual DbSet<CaseStudy> CaseStudies { get; set; }
public virtual DbSet<Group> Groups { get; set; }
public virtual DbSet<InitialCharge> InitialCharges { get; set; }
public virtual DbSet<Product> Products { get; set; }
public virtual DbSet<Section> Sections { get; set; }
public virtual DbSet<Semester> Semesters { get; set; }
public virtual DbSet<Evaluation> Evaluations { get; set; }
public virtual DbSet<Question> Questions { get; set; }
public virtual DbSet<QuestionOption> QuestionOptions { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<IdentityRole>().ToTable("Roles");
modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
modelBuilder.Entity<Semester>().HasMany(x => x.Sections).WithOptional().HasForeignKey(e => e.SemesterId).WillCascadeOnDelete(false);
}
}
我创建了MysqlInitializer类和MySqlHistoryContext类
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>(
string.Format(
"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'",
"teachlogistics"));
// 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();
}
}
}
}
配置类
internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
ContextKey = "Tesis.DAL.ApplicationDbContext";
// register mysql code generator
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema));
}
protected override void Seed(ApplicationDbContext context)
{
UserBL.CreateFirstUser(context);
}
}
MySqlHistoryContext类:
public class MySqlHistoryContext : HistoryContext
{
public MySqlHistoryContext(DbConnection connection, string defaultSchema)
: base(connection, 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();
}
}
我不知道我在做什么错,我已经阅读了这里回答的几个问题,并特别关注了以下内容: 如何使用ASP.NET Identity和MySQL Provider设置应用程序
我会感谢您的帮助:)
谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.