我正在开发一个项目,它从环境变量中获取Entity Framework的连接字符串,如下所示:
public class SomeTests {
[Fact]
public async void TestSomething() {
string connectionString = Environment.GetEnvironmentVariable("APP_CONN_STR");
var appContextOptionsBuilder = new DbContextOptionsBuilder<AppDataContext>();
appContextOptionsBuilder.UseMySql(connectionString); // hardcoded mysql
AppDataContext context = new AppDataContext(appContextOptionsBuilder.Options);
Assert.Equal(context.Country.Count(), 0);
}
}
....
public partial class AppDataContext : DbContext, IAppDataContext
{
public AppDataContext(DbContextOptions options) : base(options)
{
}
public virtual DbSet<Country> Country { get; set; }
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Country>(entity =>
{
entity.ToTable("country");
...
});
...
}
}
上面的代码是一些自动化集成测试的引导程序代码。从历史上看,每个开发人员都在网络上使用相同的旧数据库实例而没有任何问题。我试图让这些测试在一个孤立的环境中运行,所以我设置了一个空的新mysql数据库(使用docker使其可重现),并让Entity Framework用一个模式填充它。
问题是,当我在这个mysql实例中创建一个空数据库并给该数据库提供一个连接字符串时,我得到的表没有找到错误:
connection str: Server=127.0.0.1;Port=3306;Database=app_mysql_db;Uid=root;Pwd=****;
error: MySql.Data.MySqlClient.MySqlException : Table 'app_mysql_db.country' doesn't exist
我发现EF不会在现有数据库中创建表,如果EF自己创建表,它只会用表填充数据库。这是EF的默认行为。
所以我尝试从连接字符串中删除数据库名称:
connection str: Server=127.0.0.1;Port=3306;Uid=root;Pwd=****;
error: MySql.Data.MySqlClient.MySqlException : No database selected
那么如何让Codeity模式中的Entity Framework创建我的表?