簡體   English   中英

ASP.NET 核心 Web API / Angular- 在單個請求/事務中創建和設置關系

[英]ASP.NET Core Web API / Angular- Create & Set Relationships in Single Request/Transaction

關鍵是我應該如何處理在單個請求或事務中在新創建的實體上創建一對一關系和一對多關系的情況。

具體示例:

  • 第 1 個人 - N 封電子郵件
  • 人 1 - 1 Email(默認電子郵件)[必填]

我想在對服務器的單個事務/請求中處理人員的創建、電子郵件和默認 email 的設置。

注意:我使用的是 ASP.Net Core 3.1 Web API、EF Core 和 Angular 2+。

問題:一旦我提交了包含所有關系/數據的請求,我就無法真正知道哪些新電子郵件是默認的,因為它們還沒有可比較的 ID。 到目前為止,ID 是自動遞增的 int 並在插入時創建。 (我知道我可以通過比較 email 值(例如地址)來解決這個問題,但這不是一般使用的好方法。)

潛在的解決方案:

  1. 將主鍵從 int 切換到 Guid(s) 並為所有這些對象創建客戶端 ID,然后在 API controller 當我創建電子郵件並設置默認值時,我知道 Z0C83F57C783A0B4A39EABC 對應於剛剛插入的列表和 7EBZ39EABC關系將被正確保存。 (我來自 Ember Data 背景,所以這對我來說似乎是最自然的,但我對其他解決方案持開放態度。)

  2. 使用允許我使用 email 發送額外數據的視圖模型/自定義請求,以表示這是默認的 email。 我不是特別喜歡這種方法,因為我認為這種關系的實例越多,就會變得越混亂。

我很想聽聽有關此問題的潛在解決方案和其他方法的一些想法,在此先感謝!

編輯:添加了 Class 示例(使用 Fluent API 配置模型/關系)

我知道我不需要連接實體,因為它不是很多 - 很多,但是當許多事情最終可能會加入 email 表時,它可能對添加額外數據/保持表清潔很有用,並且不是t 手頭的問題。

數據模型草稿,因為我現在沒有可用的確切文件。

public class Person
{

    public int Id { get; set; }
    public string Name { get; set; }

    public int DefaultEmailId { get; set; }
    public Email DefaultEmail { get; set; }

    public virtual ICollection<PersonEmail> PersonEmails { get; set; }

}

public class Email
{

    public int Id { get; set; }
    public string Address { get; set; }

    public virtual ICollection<PersonEmail> EmailPersons { get; set; }
}

public class PersonEmail
{
    public int Id { get; set; }

    public int EmailId { get; set; }
    public Email Email { get; set; }

    public int PersonId { get; set; }
    public Person person { get; set; }

}

經過一番思考和@GertArnold 的建議,這是我目前要采用的解決方案。

我將添加一個單獨的列/字段,該列/字段將具有生成的客戶端 ID,Guid,我可以在 API controller 或前端組件中知道 email 在任何時候都是默認值。

public Guid ClientId { get; set; } // or some other name

這將允許我將主鍵保留為 int,但在前端和后端有一個穩定的業務邏輯標識符。 如果認為有必要,它還將允許我靈活地過渡到使用 Guid 作為主鍵並將 int id 作為 db 性能的索引列。

我預見到的唯一問題是在某些情況下比較客戶端 id 與主鍵 int id 的奇怪/混淆,例如:查詢、業務或前端邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM