首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何允许具有nullable: false的循环关系?

如何允许具有nullable: false的循环关系?
EN

Stack Overflow用户
提问于 2019-05-27 01:53:03
回答 2查看 1.2K关注 0票数 0

我想存储谁是每个记录的“创建者”和“更新者”,作为对数据库中"User“表的引用。这适用于每个表,包括"User“表本身。这是因为记录可能是由正在注册的用户或其他已存在的用户创建的。

在"User“表上,我有一个DB触发器,它默认将"creator”和"updater“字段填充为与新生成的"id”相同的值,因此我希望在"creator“和"updater”列上使用NOT NULL约束。不幸的是,这将导致以下错误:“检测到循环关系: User -> User.要解决此问题,您需要在此依赖关系结构中的某个位置设置nullable: false。”

有没有办法让我用TypeORM与非空值约束建立循环关系?

EN

回答 2

Stack Overflow用户

发布于 2019-05-27 02:13:55

我真的能让它工作。我将分享我的解决方案,以防有人在寻找答案。

在我尝试通过以下方式自动生成"created_by“列之前:

代码语言:javascript
复制
@ManyToOne(type => User, { onUpdate: 'CASCADE', onDelete: 'CASCADE', nullable: false })
@JoinColumn({ name: 'created_by' })
creator: User

我所要做的就是从那里删除nullable: false,并将它移到一个新的@Column字段中,这样我就可以:

代码语言:javascript
复制
@Column({ nullable: false })
created_by: number

@ManyToOne(type => User, { onUpdate: 'CASCADE', onDelete: 'CASCADE' })
@JoinColumn({ name: 'created_by' })
creator: User
票数 3
EN

Stack Overflow用户

发布于 2019-12-26 18:01:04

我也遇到过类似的问题。我有一个场景,在同一个表中有外键。如果我再多解释一下我的场景。我当时正致力于在应用程序中存储条件语句。

代码语言:javascript
复制
condition#1 a > 4 
condition#2 a + b < 0 

现在,我想让用户能够在b/w condition#1和condition#2中放置一个逻辑运算符。假设用户选择了b/w中的OR运算符。

代码语言:javascript
复制
(condition#1 OR condition#2)

现在有趣的部分来了,我觉得有必要在同样的FK。如果用户想要在#1和#2之前或之后使用OR运算符添加另一个条件,该怎么办?

代码语言:javascript
复制
condition#3  OR (condition#1 OR condition#2)

因此,为了存储这些条件,我创建了关系。我为这个场景存储了两条记录,第一条记录用于存储(condition#1 OR condition#2),第二条记录用于存储condition#3 OR (condition#1 OR condition#2)

现在来看看我是如何修复它的。以前是这样的:

代码语言:javascript
复制
export class ConditionLogicalOperator {

@PrimaryGeneratedColumn({
type: "int",
name: "ConditionLogicalOperatorID"
})    
ConditionLogicalOperatorID: number;

@Column("int", {
nullable: false,
name: "LogicalOperatorID"
})
LogicalOperatorID: number;

@ManyToOne(() => ConditionLogicalOperator, (ConditionLogicalOperator: ConditionLogicalOperator) => ConditionLogicalOperator.conditionLogicalOperators)
@JoinColumn({ name: 'ConditionID1' })
conditionLogicalOperator1: ConditionLogicalOperator | null;

@ManyToOne(() => ConditionLogicalOperator, (ConditionLogicalOperator: ConditionLogicalOperator) => ConditionLogicalOperator.conditionLogicalOperators2)
@JoinColumn({ name: 'ConditionID2' })
conditionLogicalOperator2: ConditionLogicalOperator | null;



....
....

}

诀窍是在Relationship中添加一个空对象{}。请注意每个属性中@ManyToOne行末尾的{}。这对我很管用。

代码语言:javascript
复制
export class ConditionLogicalOperator {

@PrimaryGeneratedColumn({
type: "int",
name: "ConditionLogicalOperatorID"
})
ConditionLogicalOperatorID: number;

@Column("int", {
nullable: false,
name: "LogicalOperatorID"
})
LogicalOperatorID: number;

@ManyToOne(() => ConditionLogicalOperator, (ConditionLogicalOperator: ConditionLogicalOperator) => ConditionLogicalOperator.conditionLogicalOperators, { })
@JoinColumn({ name: 'ConditionID1' })
conditionLogicalOperator1: ConditionLogicalOperator | null;

@ManyToOne(() => ConditionLogicalOperator, (ConditionLogicalOperator: ConditionLogicalOperator) => ConditionLogicalOperator.conditionLogicalOperators2, { })
@JoinColumn({ name: 'ConditionID2' })
conditionLogicalOperator2: ConditionLogicalOperator | null;



....
....

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56316042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档