簡體   English   中英

在Entity Framework Core上使用using()封裝DbContext

[英]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.

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