1 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
它有時(shí)會(huì)起作用但其他時(shí)候不起作用的原因是,當(dāng)您通過 ID 引用實(shí)體時(shí),EF 將提供它知道的相關(guān)實(shí)體。如果啟用延遲加載,EF 將前往數(shù)據(jù)庫拉回任何它不知道的相關(guān)實(shí)體。然而,當(dāng)涉及到序列化響應(yīng)時(shí),延遲加載可能會(huì)導(dǎo)致性能問題或循環(huán)引用錯(cuò)誤。
例如,關(guān)閉延遲加載:
如果我做類似的事情:
using (var context = new MyContext())
{
var member = new Member
{
FactoryId = 3;
// ...
}
context.Members.Add(member);
context.SaveChanges();
return member;
}
返回的成員的“Factory”引用將為#null,因?yàn)?EF 上下文不知道 Factory ID 3 實(shí)際是什么。如果工廠 ID #3 的數(shù)據(jù)記錄存在,但上下文不知道,則插入將會(huì)成功。
如果在另一個(gè)例子中我做了這樣的事情:
using (var context = new MyContext())
{
// Call some code using this context that results in the following running...
var factory = context.Factories.Single(x => x.FactoryId == 3);
// more code...
var member = new Member
{
FactoryId = 3;
// ...
}
context.Members.Add(member);
context.SaveChanges();
return member;
}
在這種情況下,EF 將返回 Factory #3 以及成員,因?yàn)樯舷挛膶?shí)例知道 Factory #3。保存成員時(shí),會(huì)自動(dòng)關(guān)聯(lián)已知參考。
上面的示例在 using 塊中使用了 DbContext,這使得場(chǎng)景看起來很明顯,但是,對(duì)于使用 IoC 容器將 DbContext 范圍限定為請(qǐng)求的代碼,例如,對(duì)于跨各種不同的給定場(chǎng)景,它可能不太清晰??梢哉{(diào)用這些方法來確定 DbContext 可能知道或不知道哪些實(shí)體。
在處理引用時(shí),您希望返回有關(guān)實(shí)體及其引用的詳細(xì)信息,或者以下代碼將受益于訪問引用,我的典型建議是設(shè)置引用,而不是實(shí)體中的 FK。通過這種方式,您可以確保您正在創(chuàng)建的實(shí)體處于完整且適合目的的狀態(tài)。
例如:
using (var context = new MyContext())
{
var factory = context.Factories.Single(x => x.FactoryId == factoryId);
var member = new Member
{
Factory = factory;
// ...
}
context.Members.Add(member);
context.SaveChanges();
return member;
}
我避免在實(shí)體中完全公開 FK 以強(qiáng)制使用引用,并使用影子屬性 (EFCore) 和映射 (EF6) 來確保 FK 在我的實(shí)體中不可訪問。FK 的問題在于,當(dāng)編輯同時(shí)具有引用和 FK 列的實(shí)體時(shí),有 2 個(gè)事實(shí)來源。更新 Factory 是否會(huì)更改工廠引用,或者更新 FactoryId 是否會(huì)更改?如果我有一個(gè)指向 Factory ID 3 的 Factory 引用,但我將 Member 上的 FactoryId 更改為 4,該怎么辦?有些代碼可能依賴于 FK,而其他代碼可能會(huì)轉(zhuǎn)到工廠參考。
顯式地使用引用意味著相關(guān)實(shí)體在此時(shí)被斷言(而不是等待 SaveChanges 上的任意數(shù)量的 FK 違規(guī))。它將使用上下文已加載的任何加載引用,或者如果需要?jiǎng)t轉(zhuǎn)到數(shù)據(jù)庫。
我確實(shí)使用 FK 而不是引用來進(jìn)行批量操作,我只想盡快更新或插入大量信息。在這些情況下,我使用有界上下文,其中包含帶有 FK 的簡(jiǎn)單實(shí)體定義,并且沒有創(chuàng)建、設(shè)置 FK 和保存的引用。無需返回完整的數(shù)據(jù)和參考。
- 1 回答
- 0 關(guān)注
- 177 瀏覽
添加回答
舉報(bào)