从实体框架6迁移Code First MSSQL到MySQL

时间:2017-05-13 12:40:25

标签: mysql sql-server entity-framework entity-framework-6

我曾多次在MSSQL中使用EF Code,但这是我第一次在MySQL上使用它。

我已经在AWS上使用用户名和密码分配了MySQL数据库并使用MySQL Workbench我可以看到数据库并创建/删除表... Happy Days。

我的Code First解决方案出现了问题,其中包管理器在尝试创建表时没有报告任何错误,但表在工作台中不可见......他们正在某个地方,但我有不知道在哪里...

我启用了迁移功能,并且使用

为表名添加前缀

这是我的连接字符串:

<connectionStrings>
<add name="MyContext" providerName="MySql.Data.MySqlClient"
    connectionString="server=mysql-portal.blahblahblah.us-somewhere-1.rds.amazonaws.com;port=3306;database=mydatabasename;uid=myusername;password=mypassword"/>
</connectionStrings>

这是我的DbContext:

public class MyContext : DbContext
{
    public MyContext() : base("MyContext")
    {
        Database.SetInitializer<MyContext>(new MyDbInitializer());
    }

    public virtual DbSet<AgentData> AgentDatas { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.HasDefaultSchema("mydatabasename");
    }
}
public class MyDbInitializer : CreateDatabaseIfNotExists<MyContext>
{
    protected override void Seed(MyContext context)
    {
        base.Seed(context);
    }
}

当我添加迁移时,代码看起来是正确的:

CreateTable(
            "mydatabasename.AgentData",
            c => new
                {
                    Id = c.Long(nullable: false, identity: true),
                    State = c.String(),
                    AgentName = c.String(),
                    AgentLogin = c.String(),
                    AgentPassword = c.String(),
                    NAID = c.String(),
                    License = c.String(),
                    Proxy = c.String(),
                    Enabled = c.Boolean(nullable: false),
                    American_States_id = c.Long(),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("mydatabasename.American_States", t => t.American_States_id)
            .Index(t => t.American_States_id);

正如我所说,当我运行此迁移并更新数据库时,我不会收到任何错误。

但我无法在工作台中看到该表,如果我尝试以下内容,则表示该表不存在...

public static async Task<List<Model.AgentData>> GetAllAgents()
    {
        using (MyContext db = new MyContext())
        {
            return await db.AgentDatas.ToListAsync();
        }
    }

我很难过......我没有任何其他数据库的权限......那么他们去哪里以及我做错了什么,他们不会出现在正确的数据库中:

modelBuilder.HasDefaultSchema("mydatabasename");

更新

陌生感继续。

我找不到上述原因无效的原因。因此,我决定开始一个完全干净的解决方案,并在该解决方案中从头开始构建项目。

它完美无缺。我可以看到我的表,我可以在数据库中添加/删除表。

所以,我想,没问题。我现在将该工作项目添加到我的其他解决方案中。我从主解决方案中删除了旧解决方案。删除了目录。将工作项目复制到主解决方案目录并将其添加到解决方案......

它开始做同样的事情......它报告在包管理器中创建表没有错误但是我在Workbench中看不到它们并且无法向它们添加数据。

这两个解决方案/项目都在2017年的Visual Studio社区中。

有效的是一个只包含工作项目的解决方案。无法解决的解决方案中包含多个现有项目。

为什么,当我将一个工作项目导入到解决方案中时,它会停止工作....

任何人都可能有猜测吗?

更新

这开始看起来更像是VS2017中的一个错误

我刚在本地MSSQL实例中找到了所有缺少的表和数据库!

就像在多项目解决方案中它选择MSSQL的本地实例并忽略App.config中MySQL数据库的连接字符串一样!

当我进入&#34;服务&#34;并停止我的本地SQL Server实例并尝试执行启用 - 迁移 - 强制我得到错误

  

找不到服务器或无法访问服务器。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)---&gt; System.ComponentModel.Win32Exception:系统找不到指定的文件

1 个答案:

答案 0 :(得分:1)

我设法通过2次更改解决了我的问题

  1. 我添加了[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfigu ration))]作为我的HudHomeContext类的声明

  2. 我把连接字符串放在我的基本声明中......

  3. 所以它现在看起来像这样:

     [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfigu‌​ration))]
    public class MyContext : DbContext
    {
        public MyContext() : base("server=mysql-portal.blahblah.us-blah-1.rds.amazonaws.com;port=3306;database=blahblah;uid=myusername;password=MYPASSWORD")
        {
            Database.SetInitializer<MyContext>(new MyDbInitializer());
        }