Entity Framework代码优先迁移部署数据库的位置

时间:2018-01-23 17:41:26

标签: entity-framework migration connection-string code-first

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

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

有人请解释迁移和更新数据库如何处理连接字符串?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

更多信息herehere

更新:从Package Manager控制台添加了一些有关执行的信息:

要将连接字符串传递给Package Manager控制台,您可以执行以下操作:

  • 在控制台命令中添加显式参数ConnectionString(完整的连接字符串,而不仅是配置文件中的名称)。这样就无需将连接字符串添加到库的配置文件中。

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

  • DbContext中添加无参数构造函数,并在基础构造函数调用中对连接字符串名称进行硬编码,如下所示:

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

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

  • 此外,控制台管理器默认使用选择作为解决方案中的启动项目的项目的配置。如果这个项目不是数据库库,它就不会像你想要的那样工作。要解决此问题,您应该将解决方案设置为"多个启动项目",然后在控制台管理器中选择数据库层项目"默认项目"下拉列表(或将带有数据层项目名称的DefaultProject参数传递给控制台命令)。