用途:指导在 Bitwarden 服务端创建或修改 Dapper 仓储方法、编写 MSSQL 存储过程与迁移脚本。
主要能力与约定:所有 Dapper 实现位于 src/Infrastructure/Dapper/Repositories/,每个仓储类实现 src/Core/ 中的接口,数据库操作默认使用存储过程,仓储方法保持轻量,仅做 C# 参数到 SQL 参数、结果集到领域对象的映射。存储过程命名遵循 {Entity}_{Action},如 User_Create、Cipher_ReadManyByUserId。
工作流:在 src/Sql/dbo/Stored Procedures/ 定义或更新存储过程,使用普通 CREATE PROCEDURE(SSDT 语法);在 util/Migrator/DbScripts/ 创建迁移脚本,使用 CREATE OR ALTER PROCEDURE 保证幂等;在仓储中用 DapperServiceProvider 调用;用 [DatabaseData] 特性编写集成测试。存储过程是 MSSQL 查询行为的唯一事实来源。
关键限制:SSDT 表文件在 CREATE TABLE 与后续索引语句之间需要 GO 批处理分隔符;新增参数必须可空并带默认值,如 @NewParam DATATYPE = NULL;新增 NOT NULL 列应使用内联默认值(ADD [Column] INT NOT NULL CONSTRAINT DF_Table_Column DEFAULT 0),避免先可空、更新、再改非空的写法;迁移脚本中不得在 dbo.Cipher、dbo.OrganizationUser 等大表上建索引,也不要指定 ONLINE = ON;默认值仅用于 BIT、TINYINT、INT、BIGINT 等数值类型,不用于字符串或 MAX 类型;修改表后需对相关视图调用 sp_refreshview,修改视图后对依赖过程调用 sp_refreshsqlmodule;GUID 列使用 UNIQUEIDENTIFIER,由应用代码 CoreHelpers.GenerateComb() 生成,禁止在存储过程中使用 NEWID() 或 NEWSEQUENTIALID()。
其他规则:每个存储过程开头写 SET NOCOUNT ON;参数用 PascalCase 的 @ParamName 并与 C# 属性名一致;约束命名采用 PK_TableName、FK_Child_Parent、IX_Table_Column、DF_Table_Column;每个过程一个文件,命名为 {Entity}_{Action}.sql。每个存储过程的行为必须在 EF Core 实现中精确复现,复杂逻辑需明确记录预期行为。
适用场景:Bitwarden 服务端数据库层开发与迁移。限制:资料未提供具体收费、平台支持范围或性能数据。