Entity Framework code-first migration 在哪里部署数据库

Where does Entity Framework code-first migration deploy database

我有一个用于数据访问层的库,它使用 Entity Framework,在 DbContext class 我通过构造函数传递连接字符串名称 DefaultConnection,然后我将此连接字符串添加到此库的 app.config 文件中。

但是当我更新到数据库时,我发现数据库没有创建到这个连接字符串服务器和目录中?

谁能解释一下迁移和更新数据库如何处理连接字符串?

您的图书馆无法在 运行 时间内访问 app.config 文件。只有可执行组件可以(Web api、控制台应用程序等)。您必须在使用您的库的可执行组件的配置文件中定义 connectionString 值,而不是在库的 app.config 文件中。可以使用库的 app.config 文件连接字符串的唯一情况是当包管理器控制台中的 运行ning Entity Framework 命令(如 add-migration 和类似命令)时。

处理连接字符串的推荐方式是数据层库根本不关心获取连接字符串值的责任。相反,使用该库的客户端应在实例化数据层时提供连接字符串 类。获取值的责任应该在客户端组件中,使用这样的代码获取要传递给数据层的值:

var connectionString = Configuration.GetConnectionString("MyConnectionString");

一种常见的做法是使用依赖注入组件(如 Autofac),以便客户端将连接字符串作为参数注入 DbContext 构造函数或 属性,从配置文件(或可能从其他地方)得到它之后。

关于将数据层的哪些部分公开给使用它的客户端组件,还有几种方法:您可以直接创建 DbContext 的实例,或使用 Repository 模式,或 UnitOfWork 模式。这里的重要概念是,每当您的客户端组件创建数据层之一的实例时 类,它必须从任何位置获取连接字符串值并将其传递给数据层组件(通过直接调用构造函数并将连接字符串值作为参数传递,或设置 属性,或通过依赖注入组件)。

更多信息 and here

更新: 添加了一些关于从包管理器控制台执行的信息:

要将连接字符串传递到程序包管理器控制台,您可以做几件事:

  • 向您的控制台命令添加显式参数 ConnectionString(完整的连接字符串,不仅仅是配置文件中的名称)。这避免了将连接字符串添加到库的配置文件中的需要。

  • 向您的控制台命令添加显式参数 ConnectionStringName。在库 app.config 中定义该连接字符串(但要小心,不要忘记它只会从控制台使用,并且 运行 时间使用的是可执行组件中的那个配置文件。这种方法可能会导致一些错误)。

  • 将无参数构造函数添加到您的 DbContext,并在基本构造函数调用中使用硬编码的连接字符串名称,如下所示:

    public MyDbContext() : base("DefaultConnection") { ... } 
    

    这将是控制台管理器将使用的那个。对于真正的代码执行,使用带参数的其他构造函数。同样,连接字符串必须在库的 app.config 文件中定义,这可能会导致错误。

  • 此外,控制台管理器默认使用项目 select 中的配置作为解决方案中的启动项目。如果这个项目不是数据库库,它就不会像你想要的那样工作。要解决此问题,您应该将解决方案设置为 "Multiple start up projects",并且 select 控制台管理器 "Default project" 下拉列表中的数据库层项目(或将 DefaultProject 参数与数据一起传递层项目名称到您的控制台命令)。