![](/img/trans.png)
[英]EF Code First foreign key without navigation property, but with parent collection property
[英]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仍會使用它,並且它會存在於數據庫中。
另外,我不明白外鍵的“性能”是什么意思? 額外的一列(可能很小)不會產生任何影響。 如果您指的是性能部分的導航屬性,則可以做三件事:
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.