Skip to main content

generate-guids

ABP IGuidGenerator entity IDs and sequential GUID layout for the active database provider. USE FOR: IGuidGenerator.Create; SequentialGuidGenerator; SimpleGuidGenerator; AbpSequentialGuidGeneratorOptions.DefaultSequentialGuidType; SequentialAtEnd / SequentialAsString / SequentialAsBinary. DO NOT USE FOR: cache keys and invalidation (cache-entities); cryptographic tokens or secrets (encrypt-strings); schema and repository design.

来源信息

仓库
abpframework/abp-skills
最近来源活动
2026年7月20日 03:24
检测到的 SKILL.md 语言
英语
星标
20
分支
0

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
generate-guids
description
ABP IGuidGenerator entity IDs and sequential GUID layout for the active database provider. USE FOR: IGuidGenerator.Create; SequentialGuidGenerator; SimpleGuidGenerator; AbpSequentialGuidGeneratorOptions.DefaultSequentialGuidType; SequentialAtEnd / SequentialAsString / SequentialAsBinary. DO NOT USE FOR: cache keys and invalidation (cache-entities); cryptographic tokens or secrets (encrypt-strings); schema and repository design.
license
MIT
# Generate GUIDs in ABP Use `IGuidGenerator.Create()` for entity IDs instead of `Guid.NewGuid()`. ABP's default `SequentialGuidGenerator` preserves GUID uniqueness while placing a timestamp component where the target database can order it efficiently. ## When to Use - Create a `Guid` before constructing a new entity or aggregate root. - Keep entity creation independent of the database provider. - Select the sequential byte layout for SQL Server, MySQL, PostgreSQL, or Oracle. - Use the pre-injected `GuidGenerator` property on ABP application/domain service base classes. ## When Not to Use - **Create cache keys or coordinate cache invalidation** — use cache-entities. - **Create password reset tokens, API secrets, or cryptographic nonces** — GUID generation is not a token-protection workflow. - **Choose entity key types or model database indexes generally** — this skill only covers ABP GUID generation. ## How it works ### Generate IDs at the creation boundary `IGuidGenerator` exposes only `Guid Create()`: ```csharp public class ProductAppService : ApplicationService { private readonly IRepository<Product, Guid> _productRepository; public ProductAppService(IRepository<Product, Guid> productRepository) { _productRepository = productRepository; } public async Task CreateAsync(string name) { var product = new Product(GuidGenerator.Create(), name); await _productRepository.InsertAsync(product); } } ``` Outside an ABP base class, inject `IGuidGenerator`. Pass the generated ID into the entity constructor; do not make entity constructors call a service locator or `Guid.NewGuid()`. ### Understand the two implementations - `SequentialGuidGenerator` implements `IGuidGenerator` and `ITransientDependency`; it is the default DI implementation. It uses 10 cryptographically random bytes plus a six-byte UTC millisecond timestamp. - `SimpleGuidGenerator.Instance` implements `IGuidGenerator` by returning `Guid.NewGuid()`. ABP base classes use it as a fallback only when no `IGuidGenerator` service can be resolved. Sequential GUIDs address the insert cost of random GUID clustered keys: inserting unrelated random values can require database index page reordering. They do not make insertion order a business-level ordering contract; store an explicit timestamp or sequence when ordering matters. ### Choose the database-specific layout `AbpSequentialGuidGeneratorOptions.DefaultSequentialGuidType` is nullable and defaults to `null`. `GetDefaultSequentialGuidType()` falls back to `SequentialAtEnd`. | Value | Sequential representation | Database mapping | | --- | --- | --- | | `SequentialAtEnd` | Timestamp at the end of the GUID data | SQL Server; fallback default | | `SequentialAsString` | Sequential when formatted with `Guid.ToString()` | MySQL and PostgreSQL | | `SequentialAsBinary` | Sequential when formatted with `Guid.ToByteArray()` | Oracle | The matching ABP EF Core provider modules set the value only when it is still `null`. Manual configuration is normally unnecessary when using those packages: ```csharp using Volo.Abp.Guids; Configure<AbpSequentialGuidGeneratorOptions>(options => { options.DefaultSequentialGuidType = SequentialGuidType.SequentialAsString; }); ``` Configure it manually only when the actual database storage and comparison behavior requires an override. ## Validation - Resolve `IGuidGenerator` and confirm the concrete implementation is `SequentialGuidGenerator` in the application. - Generate a large sample and assert uniqueness. - Verify the configured `SequentialGuidType` matches the real database provider and GUID column representation. - Insert representative rows and inspect index behavior with the production database engine when performance is the reason for the change. - Confirm entity creation paths use `IGuidGenerator`, including data seeders and imports. ## Common Pitfalls - **Using `Guid.NewGuid()` for entity IDs** — it bypasses ABP's sequential strategy. - **Choosing a layout by intuition** — string, binary, and SQL Server GUID ordering differ. - **Overriding an EF Core provider's correct default unnecessarily** — provider modules configure the matching type when the option is null. - **Using `SimpleGuidGenerator` as the normal application service** — it intentionally delegates to `Guid.NewGuid()`. - **Sorting by generated GUID as business chronology** — the generator contains a timestamp component but does not define a domain ordering contract.
在 GitHub 查看