第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

EF 6 添加后獲取實(shí)體

EF 6 添加后獲取實(shí)體

C#
吃雞游戲 2023-06-25 13:28:19
我在 .NET MVC 應(yīng)用程序中使用 EF 6。我有這些課程:public class Member {    public int ID { get; set; }    public string Name { get; set; }    public int FactoryID { get; set; }    public Factory Factory { get; set; }}public class Factory{    public int ID { get; set; }    public string Name { get; set; }    public virtual ICollection<Member> Members { get; set; }}要添加的代碼:var newMember = new Member();newMember.Name = 1;newMember.FactoryID = 2;context.Members.Add(newMember);context.SaveChanges();代碼獲?。簐ar member = context.Members.SingleOrDefault(x => x.ID == id);var factory = member.Factory;因此,當(dāng)我添加Member一個(gè) API 調(diào)用時(shí),然后再加入Member另一個(gè) API 調(diào)用,然后Member.Factory就定義了。Member當(dāng)我嘗試添加后立即獲取時(shí),Member.Factory是NULL.其原因何在?又該如何解決呢?
查看完整描述

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ù)和參考。


查看完整回答
反對(duì) 回復(fù) 2023-06-25
  • 1 回答
  • 0 關(guān)注
  • 177 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)