簡體   English   中英

如何在DbSet.Find()中包含相關表?

[英]How to include related tables in DbSet.Find()?

如果我想在EF7查詢中包括相關對象,那就好又容易:

var myThing = db.MyThings
                .Include(t => t.RelatedThing)
                .Where(t => t.SomeCondition == true)
                .ToList();

另外, DbSet<T>上有一個不錯的方法,可以很容易地通過其鍵加載單個對象:

var myThing = db.MyThings.Find(thingId);

但是現在,我想按其ID加載myThing以及RelatedThing 不幸的是(並且可以理解) .Find()DbSet<T>的方法,而不是IQueryable<T> 顯然我可以這樣做:

var myThing = db.MyThings
                .Include(t => t.RelatedThing)
                .SingleOrDefault(t => t.MyThingId == thingId);

但是我特別想使用.Find()方法,因為它很好且通用,並且我正在編寫一種方法,該方法通常將記錄與由Expression<Func<T, object>>指定的“包含”關系一起加載。

有什么建議怎么做?

與查找結合使用查找,可以顯式加載相關實體。 在MSDN示例下面:

using (var context = new BloggingContext()) 
{ 
  var post = context.Posts.Find(2); 

  // Load the blog related to a given post 
  context.Entry(post).Reference(p => p.Blog).Load(); 

  // Load the blog related to a given post using a string  
  context.Entry(post).Reference("Blog").Load(); 

  var blog = context.Blogs.Find(1); 

  // Load the posts related to a given blog 
  context.Entry(blog).Collection(p => p.Posts).Load(); 

  // Load the posts related to a given blog  
  // using a string to specify the relationship 
  context.Entry(blog).Collection("Posts").Load(); 
}

這是MSDN鏈接

EF6是不可能的,我認為EF Core不會改變這一點。 這是因為Find方法的主要目的是從本地緩存中獲取已經加載的實體,如果不存在,則從數據庫中加載它。 因此,緊急加載( Include )只能在后一種情況下使用,而在前一種情況下,則需要執行顯式加載。 在技​​術上可以將兩種方法組合在一起,但是很難。

我認為您應該將FirstOrDefault (或SingleOrDefault )路由與急切的加載結合使用。 您可以使用急切加載存儲庫通用方法GetById中看到EF6的示例實現。 可以使用dbContext.Model.FindEntityType(typeof(T)).FindPrimaryKey().Properties來針對EF Core進行調整,以查找PK屬性並構建謂詞。 另外,由於EF Core包含要復雜一些(需要Include / ThenInclude鏈),所以您可能會發現此線程有趣。 可以在Entity Framework Core中創建基於字符串的Include替代項嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM