TypeORM 插入与relationId
Posted
技术标签:
【中文标题】TypeORM 插入与relationId【英文标题】:TypeORM insert with relationId 【发布时间】:2020-04-22 08:51:52 【问题描述】:我使用 TypeORM,只是我想使用 relationId
插入一行。但它并没有像我预期的那样工作。
这是我的实体:
@Entity()
export default class Address extends BaseEntity
@Column(
type: 'varchar',
length: 255,
)
public title: number;
@Column(
type: 'varchar',
length: 2000,
)
public value: number;
@ManyToOne(type => User, user => user)
@JoinColumn( name: 'userId' )
public user: User;
@RelationId((address: Address) => address.user)
public userId: number;
当我尝试像下面的示例一样添加时,它会添加 null
userId
我没想到
"title": "My home address",
"value": "Lorep Ipsum Sit Amet",
"userId": 4
当我更改有效负载时,一切正常。
"title": "Ev adresim",
"value": "Nova Suites",
"user": 4
我不想使用像上面这样的有效负载。我沉迷于定义一个描述性的变量命名。感谢您从现在开始的所有贡献和所有回答。
【问题讨论】:
【参考方案1】:看起来这是 @RelationId 装饰器的 TypeORM 问题:https://github.com/typeorm/typeorm/issues/3867。
您可以使用@Column 来装饰 userId,而不是使用@RelationId,当 JoinColumn 的名称等于数字列名称时,TypeORM 匹配两者,您可以设置 userId 或用户,TypeORM 将处理它:
@ManyToOne(type => User, user => user)
@JoinColumn( name: 'userId' )
public user: User;
@Column()
public userId: number;
【讨论】:
感谢朋友的回答。实际上,我曾尝试过此解决方案,但没有奏效。它给了我一个错误error: Error: UNKNOWN_CODE_PLEASE_REPORT: Referencing column 'userId' and referenced column 'id' in foreign key constraint 'FK_d25f1ea79e282cc8a42bd616aa3' are incompatible.
我也删除了表格,但它没有按我预期的那样工作。这意味着它不会自动添加外键
我检查了终端所说的错误。我意识到,当我们定义 userId 列的属性时,与引用表的 Id 相同。它工作正常。您能否根据此更新您的答案。当您更新答案时,我将标记您的答案。因此,面临同样问题的人也能够找到他们的问题。应该是这样的 --> @Column( type: 'integer', unsigned: true, ) public userId: number;
因为在我的基实体类中,我将主 ID 定义为无符号
好的,很高兴我能帮上忙。我更新了答案,但我不是 100% 确定你的意思。【参考方案2】:
@RelationId
装饰器朝一个方向工作。
写在documentation:
将特定关系的 id(或多个 id)加载到属性中。
关系 id 仅用于表示。链接值时不会添加/删除/更改基础关系。
按照建议,您可以使用 @Column
装饰器来更新值。
【讨论】:
你完全正确。实际上,@JudgeFudge 给出的答案几乎是正确的。我已经评论了一些部分。当他/她更改她/他的答案时,我将批准该答案。 @HalilİbrahimÖzdoğan 你的问题变了吗?我给出的答案不相关?你是怎么解决这个问题的? 不,你的答案也很相关。这就是为什么我也赞成你的回答。【参考方案3】:正如 Noam 所指出的,您不能使用 @RelationId()
装饰属性来分配关系。相反,您应该使用关系本身。
如果你有一个像下面user
这样的对象的实例,你可以直接传递它。对于我只有 ID 的报价,我可以通过创建一个只有 id
属性的对象来解决这个限制。现在我不必从数据库中检索整个对象,这会浪费资源。
subscriptionRepository
.insert(
offer: id: offerId,
user: user,
)
供您参考,这是我的实体定义的摘录。
@Entity()
export class Subscription
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(
() => Offer,
(offer: Offer) => offer.subscriptions
)
offer: Offer;
@ManyToOne(
() => User,
(user: User) => user.subscriptions
)
user: User;
【讨论】:
以上是关于TypeORM 插入与relationId的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 typeorm (NestJS) 在 SQL Server 中插入 bigint
如何在 TypeORM 中使用具有自动递增 id 列的表进行级联插入