NB我不是在問如何在DB中查找/過濾物體。我不是在問Find和Where之間的區別。我不是在問泛型的含義。
根據檔案,DbContext提供了Find和Find<T>方法。通常情況下,我通過DbSet,但我注意到直接在背景關系和DB集上都有Add(),我想看看如果我也嘗試直接在背景關系而不是DB集上過濾會發生什么。
不過,我還沒有找到這種呼叫的單個示例。在頂部的免責宣告中提到了很多關于通過 DB 集的資訊和差異。但是我沒有看到任何顯示Find()或Find<T>()直接在背景關系中使用的示例。
這是否可能,如果可能,如何實作?Intellisense是很隱蔽的......
uj5u.com熱心網友回復:
當你在一個DbSet上使用Find時,物體的型別是已知的,所以它只需要通過提供的ID來查找。
當您在DbContext上使用Find時,您必須告訴EF從其已知的映射中查找哪個型別(物體),或者您可以使用通用版本,它定義了要搜索的物體的型別。
為什么你會使用這些方法而不是DbSet.Find?一個例子是,你不想將你的領域的某個方面作為DbSet公開。例如,如果你有一個包含Customers、Businesses等的DbSet,這些DbSet都包含對Address物體的參考,那么需要在這個范圍之外加載一個Address的情況是不常見的,所以你可能會選擇不在你的域中公開一個DbSet<Address>,因為這可能會被濫用的方便。在你的DbContext確實需要定位一個特定的地址的情況下,你可以使用DbContext.Find<Address>(addressId)來加載它。
說實話,我不使用DbContext.Find(),我甚至不使用DbSet.Find(),我更喜歡使用IQueryable和投影來作業。但是,這也是一種選擇。
uj5u.com熱心網友回復:
它做同樣的事情,但沒有使用DbSet。它通過指定你想要獲取的type(物體)來作業。你只需要指定型別,它必須與你的DbSet相匹配。
這是否可行,如果可行的話,怎么做?
public class MyContext : DbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options) { }
public DbSet<City> Cities{ get; set; }
public DbSet<State> States { get; set; }
然后像這樣使用它:
MyContext context = CreateContext() // or inject it...
//將回傳id==5的城市。
object myUntypedCity = context.Find(typeof(City), 5) 。
// will return the city which have id == [your guid].
City myTypedCity = context.Find<City>(Guid.NewGuid())。
作為一個附注;Add()在Context上的作業方式相同。它將檢測它是哪種型別的物體,并把它放在正確的DbSet上。我不知道如果你有幾個DbSet使用相同的型別會發生什么。
為什么我們要在背景關系中使用一個非通用的Find(),因為相當多的 DB使用整數作為ID,從而確保不同物體/表之間的ID值不明確。 不同物體/表之間的模糊ID值
在某些情況下,您可能沒有暴露DbSet,或者您只知道物體的型別。在制作一些非常通用的代碼時,這可能非常方便,因為你沒有一個型別化的物體,也不知道它的id(主鍵)的確切型別。它可能是一個Guid或者一個int。我自己從未發現Find在DbContext上的實際用途。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/309866.html
標籤:
