【发布时间】:2017-10-12 16:35:00
【问题描述】:
我曾多次在 MSSQL 中首先使用 EF 代码,但这是我第一次在 MySQL 上使用它。
我已经在 AWS 上分配了一个 MySQL 数据库,其中包含用户名和密码,并且使用 MySQL Workbench 我可以查看数据库并创建/删除表......快乐的日子。
我的 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 中看不到它们,也无法向它们添加数据。
这两个解决方案/项目都在 Visual Studio Community 2017 中。
有效的解决方案是只包含工作项目的解决方案。不起作用的解决方案中有多个现有项目。
为什么,当我将工作项目导入解决方案时,它会停止工作......
谁能大胆猜测一下?
更新:
这开始看起来更像是 VS2017 中的错误
我刚刚在我的本地 MSSQL 实例中找到了所有缺失的表和数据库!
这就像在多项目解决方案中选择本地 MSSQL 实例并忽略 App.config 中 MySQL 数据库的连接字符串!
当我进入“服务”并停止我的本地 SQL Server 实例并尝试执行 Enable-Migrations -Force 我得到错误
服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)---> System.ComponentModel.Win32Exception:系统找不到指定的文件
【问题讨论】:
-
您是否尝试过将
DbConfigurationType属性应用于您的DbContext,例如[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class MyContext : DbContext { .. } -
当我尝试然后尝试使用干净的数据库(Enable-Migrations -Force)时,我得到对象引用未设置为对象的实例。在包管理器中
-
我不知道。在针对 MySQL 进行测试时,我总是使用这样的属性。而且我从不使用
HasDefaultSchema,所以我的迁移表以dbo.为前缀。对我来说,切换和使用 MySQL 数据库总是足够的。祝你好运。
标签: mysql sql-server entity-framework entity-framework-6