繁体   English   中英

具有Mysql的实体框架“无法检查模型兼容性,因为数据库不包含模型元数据”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM