代码第一模式与mysql的连接字符串

时间:2017-10-18 15:00:37

标签: entity-framework

我正在开发一个项目,它从环境变量中获取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创建我的表?

0 个答案:

没有答案