[英]Should I dispose DbContext when using Entity Framework Core
[英]Encapsulating DbContext with using() on Entity Framework Core
我想嘗試通過get語句公開DbContext實例:
public class SomeContext : DbContext
{
public SomeContext()
{
}
public DbSet<SomeModel1> SomeModel1s { get; set; }
public DbSet<SomeModel2> SomeModel2s { get; set; }
//etc
}
public class SomeInterfaceImplementation
{
SomeContext ContextInstance { get; }
//etc
}
但是,而不是使用ContextInstance
作為一個單身,我想要做的事,這樣調用ContextInstance
實際上不會是這樣的:
someVar = ContextInstance.SomeModel1s.Where(x => x.SomeID == externalID).OrderBy(x => x.SomeProperty).ToList();
//becomes the same as
using (var db = new SomeContext())
{
someVar = db.SomeModel1s.Where(x => x.SomeID == externalID).OrderBy(x => x.SomeProperty).ToList();
}
基本上,我只想隱藏using語句,並在每次調用ContextInstance時創建並配置SomeContext的實例。 希望我有道理。 有人在想什么嗎?
這可能不是一個好主意,因為DbContext
有一些標准方案。 例如DbContext
實現工作模式的單位 ,因此using
可能是必要的。
但是,盡管並非易事,但您可以做出自己想要的事情。
您需要實現IQueryProvider<TEntity>
接口,尤其是通用方法Execute
:
public class EFDbSetProvider<TEntity> : IQueryableProvider<TEntity>
where TEntity : class
{
public TResult Execute<TResult>(Expression expression)
{
using (dbContext = new DbContext())
{
return (TResult) dbContext.Set<TEntity>.Provider.Execute(expression);
}
}
}
另外,您將需要實現相應的IQueryable<TEntity>
接口,但是正如我所看到的,該實現應該非常簡單。
public class EFQueryable<TEntity> : IQueryable<TEntity>
{
. . .
}
public static class SomeContext
{
public static EFQueryable<SomeModel1> SomeModels1 { get; set; }
public static EFQueryable<SomeModel2> SomeModels2 { get; set; }
}
someVar = SomeContext.SomeModel1s.Where(x => x.SomeID == externalID).OrderBy(x => x.SomeProperty).ToList();
將從ToList
調用Execute
方法,然后它將創建DbContext
並將組合的表達式傳遞給DbSet<TEntity>.Provider.Execute
。
您可以使用Google“自定義LINQ提供程序”或“ IQueryable實現示例”。 例如,我發現了文章實施ustom LINQ提供程序,因此您可以從此處開始以獲取詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.