Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nestjs 使用cascade true保存实体时的类型问题_Nestjs_Typeorm - Fatal编程技术网

Nestjs 使用cascade true保存实体时的类型问题

Nestjs 使用cascade true保存实体时的类型问题,nestjs,typeorm,Nestjs,Typeorm,我将NestJS与TypeORM一起使用,并试图用消息保存用户对话。我将对话实体上的messages字段设置为cascade:true。但当我尝试此代码时: const user3: User = { login: 'admin', createdBy: 'system', lastModifiedBy: 'system' }; const user4: User = { login: 'user', createdBy: 'system', lastModifiedBy: 'system' }

我将NestJS与TypeORM一起使用,并试图用消息保存用户对话。我将对话实体上的messages字段设置为cascade:true。但当我尝试此代码时:

const user3: User = { login: 'admin', createdBy: 'system', lastModifiedBy: 'system' };
const user4: User = { login: 'user', createdBy: 'system', lastModifiedBy: 'system' };
const message1: Message = { content: 'Hello How are you? ', createdBy: user3.login, lastModifiedBy: user3.login };
const conversation1: Conversation = { sender: user3, reciever: user4, messages: [message1] };
getConnection().getRepository(Conversation).save(conversation1);
它将创建以下查询:

INSERT INTO "message"("id", "createdBy", "createdDate", "lastModifiedBy", "lastModifiedDate", "content", "conversationSenderId", "conversationRecieverId", "conversationDate") VALUES (?, ?, datetime('now'), ?, datetime('now'), ?, ?, ?, ?)
-- PARAMETERS: ["67348880-6897-47cb-92ef-5f66ffb2e88c","admin","admin","Hello How are you? ","b2420445-c8ee-4080-86b3-98ab12ef576b","09f3672d-9b2f-4f68-b47e-a7ca5d806ec6","2019-10-24 14:41:40.000"]
出现此错误时:

{ [Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed] errno: 19, code: 'SQLITE_CONSTRAINT' }
我可以看出messages表的外键有问题,但我无法修复它,因为处理创建的是TypeForm库,而不是我。 我在互联网上搜索(文档、github、stackoverflow),但没有成功。 我认为这是TypeForm库中的bug,但我是个新手,所以我更喜欢问自己是否做错了什么

以下是我的实体:

export abstract class BaseEntity {
  @ObjectIdColumn()
  @PrimaryGeneratedColumn('uuid')
  id?: string;

  @Column()
  createdBy?: string;

  @CreateDateColumn()
  createdDate?: Date;

  @Column()
  lastModifiedBy?: string;

  @UpdateDateColumn()
  lastModifiedDate?: Date;
}

@Entity('user')
export class User extends BaseEntity {
  @Column()
  login?: string;

  @OneToMany(type => Conversation, conversation => conversation.sender)
  sentConversations?: Conversation[];

  @OneToMany(type => Conversation, conversation => conversation.reciever)
  recievedConversations?: Conversation[];
}

@Entity()
export class Conversation {
  @PrimaryColumn()
  senderId?: string;

  @PrimaryColumn()
  recieverId?: string;

  @CreateDateColumn({ primary: true })
  date?: Date;

  @OneToMany(type => Message, message => message.conversation, { cascade: true })
  messages: Message[];

  @ManyToOne(type => User, user => user.sentConversations)
  @JoinColumn({ name: 'senderId' })
  sender?: User;

  @ManyToOne(type => User, user => user.recievedConversations)
  @JoinColumn({ name: 'recieverId' })
  reciever?: User;
}

@Entity('message')
export class Message extends BaseEntity {
  @Column({ length: 10000 })
  content: string;

  @ManyToOne(type => Conversation, conversation => conversation.messages)
  conversation?: Conversation;
}
在该存储库中,您将能够复制错误:

外键约束在数据库表上。在RDBMS术语中,级联意味着它将在每个关系中传播。我相信您创建的adminID不是用户表中的用户。您需要首先查询该用户,然后将其用于消息推送。这应该能解决你的问题

  • 从用户中选择*,其中uname='admin'
  • 插入到消息表中,其中userId=(userId来自1)

  • 庆祝


  • 我检查了你的git项目,如果你在
    orm.config.js
    中更改
    synchronize:false
    ,一切都会正常工作