[英]How to POST OData entity and link it to multiple existing entities at the same time?
[英]How to POST multiple related entities with Entity Framework + OData?
發布多個相關實體並檢查所需屬性的正確方法是什么?
我有兩個實體Product
和Package
。 一個Product
可以有多個Packages
。 沒有相關Product
Package
就不能存在。
當我發布具有多個Packages
集合的新Product
時, ModelState
表示模型無效,因為Packages
沒有所需的productId
外鍵集。 這會導致我的 API 返回BAD REQUEST
狀態。
我的理解是Entity Framework 支持這個。 我希望ModelState
檢測到 Package productId
FK 將自動設置,因此不會無效。
如果我刪除檢查ModelState
有效性的代碼塊,實體框架會按預期運行,並且會創建Product
和Packages
。
POST /api/v1/Products
BODY
{
"name": "Coca-Cola",
"packages": [
{
"count": 6,
"quantity": 12,
"quantityUnit": "oz"
}
]
}
這是我的控制器功能:
[HttpPost]
[ODataRoute("")]
[EnableQuery]
public virtual async Task<IActionResult> PostEntity([FromBody] Product entityToCreate)
{
//Removing this block will cause the request to succeed
// but will also allow invalid requests to get to the database
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_context.Packages.Add(entityToCreate);
await _context.SaveChangesAsync();
return Created("DefaultApi", entityToCreate);
}
這是我的模型:
public class Product: ModelBase
{
[Required]
public string name { get; set; }
public List<Package> packages { get; set; }
}
public class Package: ModelBase
{
//some required props...
[Required]
[ForeignKey("product")]
public Guid? productId { get; set; }
public Product product { get; set; }
}
我調查過的一些事情:
刪除packageId
上的[Required]
屬性並手動編輯數據庫遷移以包含約束。 這會導致數據庫稍后在堆棧中拋出錯誤。 我寧願在進入數據庫之前失敗
編寫我自己的驗證屬性。 鑒於 EF 文檔聲稱支持這一點,這似乎沒有必要
可能使用 OData 批量請求
我通常會創建一個非常具體的“模型”類(不是實體)來表示 HTTP Post(Put、Patch 等)的有效負載。 在這種情況下,您需要一組模型。 然后我有特定於這組模型的驗證規則。 有些人稱這些模型為 DTO、ViewModel 等。重要的是它們不是 EF 實體。
在驗證它們的有效性之后,您必須將這些模型映射到適當的實體中,以便它們可以通過 EF 進行持久化。 這種映射是將實體與公開模型分離的不幸稅收。 您可以手動執行此操作或使用automapper 之類的庫。
這種策略有很多優點:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.