将数据库代码移动到单独的程序集时将连接字符串放在哪里

问题描述

我有一个 Razor Pages 网站应用程序,我想将我的数据库代码移动到一个单独的项目/程序集,该项目/程序集从我的主项目/程序集引用。

创建一个新的类项目并从我的 DataModel 文件夹中移动文件很简单。但我不清楚我的连接字符串去哪里(目前,它在我的主项目的 appsettings.json 中)。

如何为我的类库指定连接字符串?

解决方法

连接字符串应该在服务连接到 DbContext 的同一个项目中配置,所以你可以保持 appsettings.json 原样。

设置与 DB 的连接的是配置项目(设置所有依赖项的项目),EF 迁移工具需要该连接来跟踪和应用更改。任何程序集都可用于存储迁移,但需要为具有实际连接的项目调用 EF 工具。

EF Core 使用依赖注入为运行时配置服务,包括为任何数据库设置连接字符串。 DB 类如何与其环境交互的控制权交给运行它的应用程序,这允许跨多个实例、状态甚至提供程序使用相同的 DB 代码。 EF Core 使用部署它的 DB 的当前状态和提供程序来确定更改和脚手架,因此它只能使用连接到 DB(通常是开发实例)的 DbContext 的配置实例创建迁移。

当一个解决方案由需要相同迁移的具有公共数据模型的多个依赖服务组成时,解决方案中只有一个项目应负责管理数据库状态。无论选择哪个项目,它都需要在启动时创建一个具有有效连接的 DBContext,以便 EF 工具工作。 ASP.NET Core 使用 Microsoft.Extensions.Configuration 包和 UseStartup 方法使配置变得简单。这可以是您现有的 UI 项目,它将从现有设置中读取连接字符串,并在启动时将其传递给您的 CustomDbContext。 EF Tools CLI 将使用默认配置文件(绿色运行箭头)从 launchSettings.jsonappSettings.json 获取设置以连接到数据库。配置应在您部署到的每个环境中就位,以便可以从同一个配置项目运行迁移并根据需要应用。

您可以避免使用 ASP.NET 并在您的数据包中创建一个 custom startup class 来运行以应用迁移,但是对于已经包含在框中的东西来说,这是很多额外的工作。 DbContext 类确实有一个 OnConfiguring 方法可用于设置连接。将配置置于软件可以运行的代码限制内,因此它仍然应该是 set externally

可以从另一个包中引用 DbContext:

可以在单独的“纯”项目中定义 DbContext 和模型,然后在 Startup 中像这样引用:

    using mysolution.Data.CustomDbContext;
...
     services.AddDbContext<CustomDbContext>(options =>
                    options.UseSqlServer(
                        Configuration.GetConnectionString("defaultConnection")));

配置要运行的 DbContext 以及存储迁移的位置:

棘手的部分是应用迁移(如果您使用它们)。如果您的 Razor 程序集名为 'mysolution_UI',并且您的数据项目为 'mysolution_Data'。将数据、模型、迁移移动到 mysolution_Data 并将其添加到 mysolution_UI 项目中的启动项:

    services.AddDbContext<CustomDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("defaultConnection"),b => b.MigrationsAssembly("mysolution_Data")));

然后在添加或部署包时,应从 'mysolution_UI' 项目中调用迁移。

   Add-Migration NewMigration -Project mysolution_UI

这允许多个项目为连接到同一个数据库的实体使用数据包,但只有一个负责维护迁移。