簡體   English   中英

EF的代碼優先,如何在不設置數據庫表之間外鍵的情況下定義導航屬性關系

[英]Code first of EF, how to define navigation property relationship without setting foreign key between table in database

我首先使用實體​​框架的代碼。 有兩個類“問題”和“用戶”。 我定義了如下關系:

this.HasRequired(v => v.Creator).WithMany(v => v.Questiones)
.HasForeignKey(v => v.CreatorId).WillCascadeOnDelete(false);

整理數據庫后,我發現它總是在User的ID和Question的CreatorId之間創建外鍵。 由於FK的性能較低(和其他原因),我想在不設置數據庫外鍵的情況下定義導航屬性關系嗎? EF創建后刪除FK嗎? 如果使用流利的api無法做到這一點,您能告訴我為什么EF以這種方式設計嗎?

關於FK的性能較低。 我有一個用戶表,其中有500萬條記錄。 當我將一個Question插入db時,由於db從User表中檢查了question.CreatorId驗證,因此它總是比沒有FK時慢。 還有許多其他原因需要刪除FK。

我認為我有些執迷,因為我認為創建FK后刪除FK既奇怪又丑陋。 我想要的是通過在流暢的api中使用WithoutForeignKey之類的東西來實現這一點:

this.HasRequired(v => v.Creator).WithMany(v => v.Questiones)
.WithoutForeignKey(v => v.CreatorId).WillCascadeOnDelete(false); 

不用懷疑為什么要嘗試做這個奇怪的事情,而只回答一個問題:您可以在生成后刪除fk約束,也可以使用遷移並從遷移代碼中刪除FK生成。

即使不存在fk約束,遍歷導航屬性時生成的SQL代碼也可以使用,除了級聯刪除

如果要在兩個表之間建立關系,則需要定義一個外鍵。 沒辦法。 即使您在流利的api中使用Map() ,也只能在模型中隱藏外鍵,在后台EF仍會使用它,並且它會存在於數據庫中。

另外,我不明白外鍵的“性能”是什么意思? 額外的一列(可能很小)不會產生任何影響。 如果您指的是性能部分的導航屬性,則可以做三件事:

  1. 不要在模型中包含它們
  2. 使它們成為非虛擬的以禁用延遲加載
  3. ctx.Configuration.LazyLoadingEnabled = false;一起禁用所有延遲加載ctx.Configuration.LazyLoadingEnabled = false;

如果您不想告訴db有關關系並將兩個實體都視為不相關(我想知道為什么),那么只需忽略這些導航屬性和FK字段即可。 請注意,您將負責管理相關實體:從數據庫保存和加載它們,更新ID等

this.Ignore(q => q.Creator);
this.Ignore(q => q.CreatorId);

而且您還需要忽略關系的另一面,否則EF會使用默認名稱Creator_CreatorId生成FK列。 因此,在Creator實體配置中:

this.Ignore(c => c.Questiones);

暫無
暫無

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

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