Entity framework 实体框架代码第一次迁移在哪里部署数据库

Entity framework 实体框架代码第一次迁移在哪里部署数据库,entity-framework,migration,connection-string,code-first,Entity Framework,Migration,Connection String,Code First,我有一个用于数据访问层的库,它使用实体框架,在DbContext类中,我通过构造函数传递连接字符串名称DefaultConnection,然后我将此连接字符串添加到此库的app.config文件中 但是当我更新到数据库时,我发现数据库没有被创建到这个连接字符串服务器和目录中 有人请解释迁移和更新数据库如何处理连接字符串吗?您的库在运行时无法访问app.config文件。只能使用可执行组件(web api、控制台应用程序等)。您必须在使用库的可执行组件的配置文件中定义connectionStrin

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

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


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

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

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

var connectionString = Configuration.GetConnectionString("MyConnectionString");
通常的做法是使用依赖项注入组件(如
Autofac
),以便客户端在从配置文件(或可能从其他位置)获取连接字符串后,将其作为参数注入到
DbContext
构造函数或属性中

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

更多信息和信息

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

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

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

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

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

    public MyDbContext() : base("DefaultConnection") { ... } 
    
    这将是console manager将使用的。对于真正的代码执行,请使用另一个带参数的构造函数。同样,必须在库的
    app.config
    文件中定义连接字符串,这可能会导致错误

  • 此外,console manager默认情况下使用解决方案中选择为启动项目的项目中的配置。如果此项目不是数据库库,它将无法按您所希望的方式工作。要解决此问题,您应将解决方案设置为“多个启动项目”,并在console manager中选择数据库层项目“默认项目”下拉列表(或将带有数据层项目名称的
    DefaultProject
    参数传递给控制台命令)


有很多默认值和约定,但我更喜欢创建一个命名连接字符串,并在上下文构造函数中设置它,这样我就知道应用了什么。请看,包控制台管理器正是我要问的,我在数据访问库中有带有连接字符串的web.config,但包控制台管理器没有不要使用它!显然它使用的是localdb服务器!我在答案中添加了一个更新,其中包含了有关此的信息。最后一段正是我想要的,谢谢:)