带有 Angular代码优先的 ASP.NET Core 项目 - 使用复合键更新子项

问题描述

我有以下型号:

public class Parent {
    public int Id {get; set;}
    public string Name {get; set;}
    public ICollection<Child> Childs {get; set;}
    ...
    public Parent()
    {
        Childs = new Collection<Child>();
    }
}

public class Child {
    public string KeyB {get; set;}
    public int KeyA {get; set;}
    public Parent Parent {get; set;}
    public int ParentId
    ...
}

我使用 Fluent API 来定义 Child 的密钥:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Child>()
        .HasKey(b => new {b.ParentId,b.KeyA,b.KeyB});
}

用于创建操作的父级控制器如下所示(子级结构相同):

[HttpPost]
public async Task<IActionResult> CreateParent([FromBody] SaveParentResource parentResource){
            
    var parent = mapper.Map<SaveParentResource,Parent>(parentResource);

    repository.Add(parent );
    await unitOfWork.CompleteAsync();

    parent = await repository.GetParent(parent.Id);

    var result = mapper.Map<Parent,ParentResource>(parent);

    return Ok(result);
}

创建操作的父级存储库如下所示(子级结构相同):

public void Add(Parent parent)
{
    context.Parent.Add(parent);
}

要在打字稿上创建一个新子项,代码如下所示:

ngOnInit(): void {
    if(this.parent.id)
      this.loadData()
}

private loadData(){
    this.childList = [];
    this.parentService.getParent(this.parent.id)
      .subscribe((parent: Parent) => {
        this.parent = parent;
        this.values.forEach(value => {
          this.childList.push({
            // Generates a list with filtered data from parent.Childs based on value
          });
        });
      });
}

saveParent(){
    var updatedParent: SaveParent = {
      id: this.parent.id,name: this.parent.name
    }
    if(updatedParent.id == 0) {
      this.parentService.create(updatedParent)
        .subscribe((parent: Parent) => {
          this.parent = parent;
          this.loadData();
        });
    } else {
      this.parentService.update(updatedParent)
        .subscribe((parent: Parent) => {
          this.loadData();
        });
    }
}

saveChild(child: Child){
    var updatedChild: Child = {
      keyB: child.keyB,keyA: child.keyA,parentId: this.parent.id
      ...
    }
    var prevIoUsChild = this.parent.childs.find(c => c.keyB == updatedChild.keyB)
    if(prevIoUsChild === undefined) {
      this.childService.create(updatedChild).subscribe();
    } else {
      this.childService.update(updatedChild).subscribe();
    }
}

当我现在尝试添加新子项或更新子项时,我会收到以下错误

INSERT 语句与 FOREIGN KEY 约束“FK_Childs_Parents_ParentId”冲突。 冲突发生在数据库“TestDb”、表“dbo.Parents”、“Id”列中。 声明已终止。

使用 Postman 测试 WebAPI 似乎适用于子 CRUD 操作,但是当我尝试从 angular 组件内部调用它时,它失败了。我的问题在哪里?我做错了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)