我有一个 Razor Pages 网站应用程序,我想将我的数据库代码移动到一个单独的项目/程序集,该项目/程序集是从我的主项目/程序集引用的。
创建一个新的类项目并从我的 Data 和 Model 文件夹中移动文件非常简单。但我不清楚我的连接字符串去了哪里(目前,它位于我的主项目的 appsettings.json 中)。
如何为我的类库指定连接字符串?
连接字符串应在服务连接到 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 并在数据包中创建一个“自定义启动类”来运行以应用迁移,但这对于现有的东西来说是大量额外的工作。 DbContext
类确实有一个
OnConfiguring
方法可用于设置连接。 将配置放置在软件可以运行的代码限制内,因此仍然应该在外部设置。 DbContext 可以从另一个包中引用:
DbContext 和模型可以在单独的“纯”项目中定义,然后在 Startup 中引用,如下所示:
using mysolution.Data.CustomDbContext;
...
services.AddDbContext<CustomDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("defaultConnection")));
棘手的部分是应用迁移(如果您使用它们)。 如果您的 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
这允许多个项目使用连接到同一数据库的实体的数据包,但只有一个项目负责维护迁移。