将数据库代码移动到单独的程序集时将连接字符串放在哪里
Posted
技术标签:
【中文标题】将数据库代码移动到单独的程序集时将连接字符串放在哪里【英文标题】:Where to put connection string when moving database code to separate assembly 【发布时间】:2021-08-28 16:25:45 【问题描述】:我有一个 Razor Pages 网站应用程序,我想将我的数据库代码移动到一个单独的项目/程序集中,该项目/程序集是从我的主项目/程序集中引用的。
创建一个新的类项目并从我的 Data 和 Model 文件夹中移动文件非常简单。但我不清楚我的连接字符串的去向(目前,它在我的主项目的 appsettings.json 中)。
如何为我的类库指定连接字符串?
【问题讨论】:
您使用的是什么版本的 .net? @GabrielMartinezBustos:5.0。请查看我的问题标签。 您是否希望引用的程序集与您的网站在同一进程中运行?还是需要作为独立的数据服务运行? @MattE.:我希望它与我的网站在同一进程中运行,就像在单个项目中一样。唯一的区别是我可以编写一个可以引用新库程序集并访问这些实体的新应用程序。 您可能认为类库使用了它自己的项目中包含的 appsettings.json 文件,但事实并非如此。它使用引用它的项目的 appsettings.json 文件。所以把它放在主项目中,不要担心。如果您打算将相同的类库用于其他 Web 项目,请将这些 appsettings 添加到它的主项目中。 【参考方案1】:连接字符串应该在服务连接到 DbContext 的同一个项目中配置,因此您可以保留 appsettings.json 原样。
设置与数据库的连接的是配置项目(设置所有依赖项的项目),EF 迁移工具需要该连接来跟踪和应用更改。任何程序集都可用于存储迁移,但需要为具有实际连接的项目调用 EF 工具。
EF Core 使用依赖注入为运行时配置服务,包括为任何数据库设置连接字符串。数据库类如何与其环境交互的控制权交给了运行它的应用程序,这允许跨多个实例、状态甚至提供程序使用相同的数据库代码。 EF Core 使用部署它的数据库的当前状态和提供程序来确定更改和脚手架,因此它只能使用连接到数据库(通常是开发实例)的已配置 DbContext 实例来创建迁移。
当一个解决方案包含多个依赖服务以及需要相同迁移的公共数据模型时,只有解决方案中的一个项目应负责管理数据库状态。无论选择哪个项目,它都需要在启动时创建一个具有有效连接的 DBContext,EF 工具才能工作。 ASP.NET Core 使用Microsoft.Extensions.Configuration
包和UseStartup
方法使配置变得简单。这可以是您现有的 UI 项目,该项目将从现有设置中读取连接字符串并将其传递给启动时的 CustomDbContext。 EF Tools CLI 将使用默认配置文件(绿色运行箭头)从launchSettings.json
和appSettings.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
这允许多个项目为连接到同一个数据库的实体使用数据包,但只有一个项目负责维护迁移。
【讨论】:
我希望在我的类库中进行迁移。这就是为什么我不确定在进行迁移和更新数据库时我的类库如何知道如何在我的主应用程序中找到设置。 @JonathanWood 你如何运行迁移? @JonathanWood 您仍然需要在与 Startup 类相同的项目中设置连接字符串。迁移可以存储在数据包中,但需要从配置包中应用。这是因为它在调用项目运行之前不知道它在哪个数据库上。 @Guru:add-migration
@JonathanWood 在将上下文和迁移移动到单独的程序集之后,您是否尝试过这样做? :)以上是关于将数据库代码移动到单独的程序集时将连接字符串放在哪里的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 Azure ML Studio 在导入数据集时将特征列转换为 DateTime