您好我有一個關于物體框架如何管理外鍵的問題。
如果我有以下模型,稱為customerModelwhich 可以與 0 次或更多購買有關:
public class CustomerModel
{
public int Id{get;set; }
[Required]
public string Name {get;set; }
[Required]
public string Surname { get; set; }
[Required]
[Range(18,110)]
public uint Age { get; set; }
[Required]
public virtual List<PurchaseModel> purchases { get; set; }
}
然后我有一個購買模型,它不包含任何客戶的導航屬性。
但是當我現在創建一個資料庫遷移時,在資料庫中,購買會得到一個CustomerId參考客戶的欄位。
因此,sql 資料庫和物體框架抽象具有“相反”的表示關系的方法。
我的問題是這是否不會對性能造成輕微影響?
假設我要進行這樣的查詢:
CustomersQuery.Where( x => x.purchases.Any(p => ...))
在我看來,這里的查詢會在資料庫中對購買表進行查找,然后將其與我目前正在使用的客戶相關聯。
對我來說,這似乎有點過于復雜,而不是讓客戶存盤購買 ID 的串列,然后“直接”進行查詢。
有人可以詳細說明為什么要這樣翻譯物體框架關系,以及在構建如上所示的查詢時要記住這一點是否很重要?
還是我應該相信物體框架正在以最有效的方式處理它?
uj5u.com熱心網友回復:
將 1:n 關系作為外鍵存盤在 n 端是標準模式(因此在您的情況下是購買中的客戶 ID)
通常,您還應該有一個索引,因此正在發生的查詢 ( select count(*) from purchase where customerId = 123) 和您描述的查詢 ( select count(*) from purchase where Id in (..., ..., ...)) 在性能上不應有顯著差異。
此外:“存盤購買 ID 的串列”以提高效率,您必須為每個客戶設定最大購買次數,否則您對每個客戶的所有購買都有一個任意的大 blob。
總而言之,在這里相信 EF,該方法是行業標準。如果您愿意,還可以添加反向導航屬性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/496137.html
