如何在Prisma中使用类似TypeORM的BaseEntity?
在Prisma 4.16.2中实现类似TypeORM BaseEntity的方案
问题分析
你的代码无法运行的核心原因有两个:
- 每个Prisma模型必须定义主键(
@id或@@id),你的Base模型缺少主键字段。 - 你试图用关联关系(
base Base)复用字段,但这会生成单独的Base表,和TypeORM中BaseEntity将字段嵌入主表的逻辑不符,且当前关联写法缺少必要的外键配置。
正确实现方式:使用嵌入式模型(Embedded Models)
Prisma不支持模型继承,但可以通过嵌入式模型实现字段复用,效果等同于TypeORM的BaseEntity。嵌入式模型的字段会直接嵌入到主模型对应的数据库表中,不会生成单独的表。
修正后的代码
// 定义嵌入式Base模型,用于复用公共字段 model Base { reg_id String @db.Char(12) reg_dt DateTime @default(now()) @db.DateTime(6) edit_id String @db.Char(12) edit_dt DateTime @updatedAt @db.DateTime(6) // 标记为嵌入式模型,不会生成单独的数据库表 @@embedded } model Test1 { id Int @id name String @db.VarChar(30) // 嵌入Base模型的所有字段 base Base } model Test2 { id Int @id name String @db.VarChar(30) // 嵌入Base模型的所有字段 base Base }
关键说明
@@embedded标记是核心:它告诉Prisma不要为Base创建单独的表,而是将其字段直接合并到引用它的Test1、Test2表中。- 生成的数据库表结构:
Test1表包含id、name、reg_id、reg_dt、edit_id、edit_dt字段。Test2表同理,包含自身字段+Base的所有公共字段。
@default(now())会在创建记录时自动填充reg_dt,@updatedAt会在更新记录时自动更新edit_dt,完全匹配BaseEntity的需求。
可选优化:添加字段前缀
如果担心嵌入字段和主模型字段名冲突,可以为嵌入式模型指定字段前缀:
model Base { reg_id String @db.Char(12) reg_dt DateTime @default(now()) @db.DateTime(6) edit_id String @db.Char(12) edit_dt DateTime @updatedAt @db.DateTime(6) // 为嵌入的字段添加前缀,生成的字段会是base_reg_id、base_reg_dt等 @@embedded(map: "base_") }
内容的提问来源于stack exchange,提问作者iLoveNodeJs
相关产品推荐
相关产品推荐

