使用 web api 发布/创建子实体对象时如何设置父实体 ID

Posted

技术标签:

【中文标题】使用 web api 发布/创建子实体对象时如何设置父实体 ID【英文标题】:How to set parent entity Id when posting/creating child entity object with web api 【发布时间】:2021-10-10 08:20:36 【问题描述】:

我有两个 Entity-Framework 实体(一个子“Note”,属于一个文件夹)和每个的脚手架 web api。我可以创建文件夹并希望能够向这些文件夹添加注释。

public class Note
    
        public int Id get; set; 
        [MaxLength(50), Required]
        public string NoteTitle  get; set; 
        [MaxLength(1000), Required]
        public string NoteContent  get; set; 
        
        public NoteFolder NoteFolder  get; set; 
    
    public class NoteFolder
    
        public int Id  get; set; 
        public string FolderName  get; set; 

    

我的帖子:

let Note = 
                "NoteTitle": this.NoteTitle(),
                "NoteContent": this.NoteContent(),
                "NoteFolder_Id:": ParentFolderId 
                ;

            
            $.ajax(
                url: `http://localhost:52657/api/Notes`,
                type: 'POST',
                dataType: 'json',
                contentType: 'application/json',
                success: function (data) 
                    window.location.replace("http://localhost:52657/");
                    alert(`Successfully Created New Note: $Note.NoteTitle`)
                ,
                data: JSON.stringify(Note)
            );

端点:

 // POST: api/Notes
        [ResponseType(typeof(Note))]
        public IHttpActionResult PostNote(Note note)
        
            if (!ModelState.IsValid)
            
                return BadRequest(ModelState);
            

            db.Notes.Add(note);
            db.SaveChanges();

            return CreatedAtRoute("DefaultApi", new  id = note.Id , note);
        

每当我发出发布请求时,都会创建注释,但我的数据库中的外键行 NoteFolder_Id 为空。如何解决这个问题?

编辑:我试过发帖:

"NoteFolder":  "Id": ParentFolderId 

以便它可以正确序列化,但这会导致在数据库中创建一个新文件夹,其 ID 会自动递增,并且创建的 Note 会引用该文件夹。

【问题讨论】:

【参考方案1】:

更改 Note 类并执行迁移,

 public class Note
    
        public int Id get; set; 
        [MaxLength(50), Required]
        public string NoteTitle  get; set; 
        [MaxLength(1000), Required]
        public string NoteContent  get; set; 

        public int? FolderId  get; set; 

        [ForeignKey("FolderId")]
        public NoteFolder NoteFolder  get; set; 
    

然后以表格形式发送帖子:

let Note = 
                "NoteTitle": this.NoteTitle(),
                "NoteContent": this.NoteContent(),
                "FolderId": ParentFolderId 
                ;

修复了问题。

仍然不确定为什么传递 NoteFolder 对象会导致在数据库中创建一个新文件夹。 https://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx本站使用我的初始模型样式来映射1:n。

【讨论】:

以上是关于使用 web api 发布/创建子实体对象时如何设置父实体 ID的主要内容,如果未能解决你的问题,请参考以下文章

使用 DDD 创建子实体的正确方法

插入新实体而不创建子实体(如果存在)

如何动态命名和创建子对象属性?

使用 RestKit 创建子对象

如何使用 Plotly Express 创建子图

如何使用 matplotlib 创建子图的大图?