EntityType 派生与属性配置
`#[derive(EntityType)]` 是 `rust-ef` 的元数据核心。它自动为实体生成表映射、列映射、行物化和快照对比所需的所有 trait 实现。
完整属性示例
#[derive(Debug, Clone, EntityType)]
#[table("products")]
pub struct Product {
#[primary_key]
#[auto_increment]
pub id: i32,
#[required]
#[max_length(100)]
#[unique]
pub sku: String,
#[column("product_name")]
pub name: String,
pub price: f64,
#[required]
pub in_stock: bool,
#[not_mapped]
pub temp_discount: Option<f64>,
}
属性详解
`#[table("name")]`
指定实体映射的数据库表名。未指定时,derive 宏会使用结构体名称的蛇形复数形式(如 `Product` → `products`)。
`#[column("name")]`
当字段名与数据库列名不一致时使用。未指定时,字段名即为列名。
`#[required]`
标记列非空。对 `String` 等类型尤其重要,否则默认为可空。
`#[max_length(n)]`
对字符串类型设置最大长度,影响 DDL 生成(如 `VARCHAR(200)`)。
`#[not_mapped]`
该字段不映射到数据库列,仅存在于内存中。常用于计算属性或临时状态。
`#[context("key")]`(v1.1.0)
将实体标记到指定的 keyed `DbContext`。未标注时,实体归属于默认上下文(`context_key = None`)。用于多数据库场景下隔离不同上下文的实体。
#[derive(Debug, Clone, EntityType)]
#[context("logs")]
#[table("log_entries")]
pub struct LogEntry {
#[primary_key]
pub id: i32,
pub message: String,
}
配合 `#[entity(T, "key")]` 配置和 `add_dbcontext_keyed` 使用,详见 [多数据库 Keyed 注册](../10-di-interceptors/keyed-databases.md)。
设计要点
| 实践 | 说明 | |------|------| | 始终标注 `#[primary_key]` | 没有主键的实体无法执行 `find(id)` 和 UPDATE/DELETE | | `Clone` 必须手动派生 | `#[derive(Clone)]` 是 `EntityType` 的前置条件 | | `Debug` 建议派生 | 便于日志和测试输出 |
下一节:[主键、自增与必填约束](keys-constraints.md)