亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候需要在 Entity Framework 中包含相關實體?

什么時候需要在 Entity Framework 中包含相關實體?

C#
瀟瀟雨雨 2022-11-21 20:18:06
當我必須實際.Include()關聯實體而當我不需要時,這對我來說似乎是任意的。在某些情況下,EF 會在沒有它的情況下為我提供相關實體的信息,而在其他情況下,它無法對相關實體執行任何操作,因為我沒有包括它們:在沒有 .Include() 的情況下工作;這是我在沒有 .Include(); 的情況下加載數據的示例。public class InvoiceService{    private ApplicationDbContext db { get; set; }    public InvoiceService(ApplicationDbContext context)    {        db = context;    }    public Invoice Get(int id)    {        return db.Invoices.SingleOrDefault(x => x.Id == id);    }}public partial class ShowInvoice : System.Web.UI.Page{    private InvoiceService invoiceService;    private readonly ApplicationDbContext context = new ApplicationDbContext();    protected void Page_Load(object sender, EventArgs e)    {        invoiceService = new InvoiceService(context);        if (!IsPostBack)        {            int.TryParse(Request.QueryString["invoiceId"].ToString(), out int invoiceId);            LoadInvoice(invoiceId);        }    }    private void LoadInvoice(int invoiceId)    {        var invoice = invoiceService.Get(invoiceId);        // Other code irrelevant to the question goes here.    }}下面是結果,其中包括與我要求的發票相關的公司數據:如您所見,公司的信息肯定是通過了,但沒有明確包含在內。沒有 .Include(); 就無法工作;相反,我在同一個項目中完成了一些與發票有關的映射,并且在獲取相關實體屬性值時出現了 NullReferenceExceptions,因為我沒有這樣做.Include()。此方法獲取指定公司的所有已批準時間表條目。此視圖模型專門用于處理發票的時間表條目的關聯(因此您根據所選的時間表條目開具發票)。public List<InvoiceTimesheetViewModel> GetInvoiceTimesheetsByCompanyId(int companyId){    var factory = new TimesheetViewModelsFactory();    var timesheets = db.Timesheets.Where(x => x.Approved && x.Company.Id == companyId && !x.Deleted).ToList();    return factory.GetInvoiceTimesheetsViewModel(timesheets);}要解決這些問題,我必須將獲取數據的查詢更改為以下內容:var timesheets = db.Timesheets.Include(i => i.StaffMember).Include(i => i.Task)            .Where(x => x.Approved && x.Company.Id == companyId && !x.Deleted).ToList();為什么 Entity Framework 有時很樂意在我沒有明確請求數據的情況下為我提供數據,有時卻要求我明確請求數據,否則會拋出錯誤?我怎么知道什么時候需要明確包含我正在尋找的數據,什么時候不需要?
查看完整描述

2 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

實體框架使用延遲加載來加載子關系。為了延遲加載模型中的工作屬性應該用virtual關鍵字標記。Ef 覆蓋它并添加延遲加載支持。


當您沒有虛擬財產時,EF 以后無法加載您的子關系數據,因此唯一可能的情況是 - 在初始數據加載期間使用Include.


public class Timesheet

{

    ...

    public virtual StaffMember StaffMember { get; set; }

    public virtual Task Task { get; set; }

    ...

}


查看完整回答
反對 回復 2022-11-21
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

這取決于你的模型。如果您已將關系屬性標記為,virtual那么您將需要使用.Include它,以便 EF 知道您需要它。這是延遲加載。保留機器的內存和數據庫請求。



查看完整回答
反對 回復 2022-11-21
  • 2 回答
  • 0 關注
  • 107 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號