使用Entity Framework Core上的using()封装DbContext

时间:2016-09-09 06:00:26

标签: c# uwp 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的实例。希望我有道理。有没有人想要做到这一点?

1 个答案:

答案 0 :(得分:1)

这可能不是一个好主意,因为有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();

Execute方法将从ToList调用,然后它将创建DbContext并将组合的表达式传递给DbSet<TEntity>.Provider.Execute

您可以google&#34;自定义LINQ提供商&#34;或&#34; IQueryable实施例&#34;。 F.E.我找到了文章Implementing a ustom LINQ provider,因此您可以从此处了解详情。