當我必須實際.Include()關(guān)聯(lián)實體而當我不需要時,這對我來說似乎是任意的。在某些情況下,EF 會在沒有它的情況下為我提供相關(guān)實體的信息,而在其他情況下,它無法對相關(guān)實體執(zhí)行任何操作,因為我沒有包括它們:在沒有 .Include() 的情況下工作;這是我在沒有 .Include(); 的情況下加載數(shù)據(jù)的示例。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. }}下面是結(jié)果,其中包括與我要求的發(fā)票相關(guān)的公司數(shù)據(jù):如您所見,公司的信息肯定是通過了,但沒有明確包含在內(nèi)。沒有 .Include(); 就無法工作;相反,我在同一個項目中完成了一些與發(fā)票有關(guān)的映射,并且在獲取相關(guān)實體屬性值時出現(xiàn)了 NullReferenceExceptions,因為我沒有這樣做.Include()。此方法獲取指定公司的所有已批準時間表條目。此視圖模型專門用于處理發(fā)票的時間表條目的關(guān)聯(lián)(因此您根據(jù)所選的時間表條目開具發(fā)票)。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);}要解決這些問題,我必須將獲取數(shù)據(jù)的查詢更改為以下內(nèi)容: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 有時很樂意在我沒有明確請求數(shù)據(jù)的情況下為我提供數(shù)據(jù),有時卻要求我明確請求數(shù)據(jù),否則會拋出錯誤?我怎么知道什么時候需要明確包含我正在尋找的數(shù)據(jù),什么時候不需要?
2 回答

慕絲7291255
TA貢獻1859條經(jīng)驗 獲得超6個贊
實體框架使用延遲加載來加載子關(guān)系。為了延遲加載模型中的工作屬性應該用virtual關(guān)鍵字標記。Ef 覆蓋它并添加延遲加載支持。
當您沒有虛擬財產(chǎn)時,EF 以后無法加載您的子關(guān)系數(shù)據(jù),因此唯一可能的情況是 - 在初始數(shù)據(jù)加載期間使用Include.
public class Timesheet
{
...
public virtual StaffMember StaffMember { get; set; }
public virtual Task Task { get; set; }
...
}

眼眸繁星
TA貢獻1873條經(jīng)驗 獲得超9個贊
這取決于你的模型。如果您已將關(guān)系屬性標記為,virtual
那么您將需要使用.Include
它,以便 EF 知道您需要它。這是延遲加載。保留機器的內(nèi)存和數(shù)據(jù)庫請求。
- 2 回答
- 0 關(guān)注
- 105 瀏覽
添加回答
舉報
0/150
提交
取消