DbContext中只改写let 字段

This commit is contained in:
2026-09-02 17:54:56 +08:00
parent 74eb8b576e
commit ed082b05f9
5 changed files with 161 additions and 22 deletions
+14 -10
View File
@@ -42,7 +42,7 @@ public class User {
### 2. 定义 DbContext 并增删改查
用 `@DbContext` 宏(推荐):纯声明类即可,宏自动补 `<: DbContext`、把每个 `DbSet<T>` 声明变成 `public prop` 并注入 `this.set<T>()`、生成 `(driverName, connStr)` 构造与 `migrations()` override:
用 `@DbContext` 宏(推荐):纯声明类即可,宏自动补 `<: DbContext`、把每个 **`let` 前缀**的 `DbSet<T>` 字段改写成 `public prop` 并注入 `this.set<T>()`(`var` / `prop` 前缀一律不改动,交给用户自行管理)、生成 `(driverName, connStr)` 构造与 `migrations()` override:
```cangjie
import std.database.sql.*
@@ -52,8 +52,8 @@ import simcu::orm.macros.*
@DbContext
public class AppDbContext {
prop users: DbSet<User>
prop orders: DbSet<Order>
let users: DbSet<User>
let orders: DbSet<Order>
}
main() {
@@ -190,8 +190,8 @@ import simcu::orm.macros.*
@DbContext
public class MyDbContext {
prop users: DbSet<User>
prop orders: DbSet<Order>
let users: DbSet<User>
let orders: DbSet<Order>
}
main(args: Array<String>) {
@@ -324,7 +324,7 @@ orm-cj/
### 3. DbContext / DbSet
**推荐:`@DbContext` 宏**。把 `DbSet` 声明为 `prop`,宏自动补继承/构造/注入/`migrations()`:
**推荐:`@DbContext` 宏**。把 `DbSet` 声明为 **`let` 前缀**(`let xxx: DbSet<T>`),宏只处理这种形式:改写成 `public prop xxx: DbSet<T> { get() { this.set<T>() } }`(public getter 保证反射可枚举);`var` / `prop` 前缀一律不改动。同时自动补继承/构造/`migrations()`:
```cangjie
import simcu::orm.*
@@ -334,8 +334,8 @@ import std.collection.* // migrations() 签名需要 ArrayList
@DbContext
public class AppDbContext {
prop users: DbSet<User>
prop orders: DbSet<Order>
let users: DbSet<User>
let orders: DbSet<Order>
}
// 用法(宏生成 (driverName, connStr) 构造)
@@ -354,8 +354,12 @@ if (!db.databaseExists() || db.hasPendingMigrations()) { db.migrate() }
```cangjie
public class AppDbContext <: DbContext {
public let users: DbSet<User>
public let orders: DbSet<Order>
public prop users: DbSet<User> {
get() { this.set<User>() }
}
public prop orders: DbSet<Order> {
get() { this.set<Order>() }
}
public init(driverName: String, connStr: String) { super(driverName, connStr) }
public init(datasource: Datasource) { super(datasource) }