定义第一个实体
实体是 ORM 的核心。`#[derive(EntityType)]` 自动实现 `IEntityType`、`IFromRow`、`IGetKeyValues` 等必要 trait。
最小实体
use rust_ef::prelude::*;
#[derive(Debug, Clone, EntityType)]
#[table("blogs")]
pub struct Blog {
#[primary_key]
#[auto_increment]
pub blog_id: i32,
#[required]
#[max_length(200)]
pub url: String,
pub rating: i32,
}
属性速查表
| 属性 | 说明 | EF Core 对应 | |------|------|-------------| | `#[table("name")]` | 映射表名 | `[Table]` | | `#[primary_key]` | 主键 | `[Key]` | | `#[auto_increment]` | 自增 | convention | | `#[required]` | 非空 | `[Required]` | | `#[max_length(n)]` | 最大长度 | `[MaxLength]` | | `#[column("name")]` | 指定列名 | `[Column]` | | `#[foreign_key(Entity)]` | 外键 | `[ForeignKey]` | | `#[navigation]` | 导航属性 | implicit | | `#[not_mapped]` | 不映射 | `[NotMapped]` | | `#[index]` | 普通索引 | `[Index]` | | `#[unique]` | 唯一索引 | `[Index(IsUnique = true)]` | | `#[concurrency_check]` | 并发标记 | `[ConcurrencyCheck]` | | `#[context("key")]` | 多数据库上下文隔离(v1.1) | — |
带关系的实体
#[derive(Debug, Clone, EntityType)]
#[table("posts")]
pub struct Post {
#[primary_key]
#[auto_increment]
pub post_id: i32,
#[required]
#[max_length(200)]
pub title: String,
pub content: Option<String>,
#[foreign_key(Blog)]
pub blog_id: i32,
#[navigation]
pub blog: BelongsTo<Blog>,
}
设计要点
| 实践 | 说明 | |------|------| | 实体必须 `Clone` | `DbSet` 内部存储需要 | | 主键类型通常为 `i32` | 自增回填兼容性好 | | `Option<T>` 自动可空 | 无需额外标注 | | 导航属性需 `#[navigation]` | 关系元数据由此生成 |
下一节:[DbContext 与 DI 注册](dbcontext-and-di.md)