我曾多次在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:系统找不到指定的文件
答案 0 :(得分:1)
我设法通过2次更改解决了我的问题
我添加了[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfigu ration))]作为我的HudHomeContext类的声明
我把连接字符串放在我的基本声明中......
所以它现在看起来像这样:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
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());
}