我想尝试通过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的实例。希望我有道理。有没有人想要做到这一点?
答案 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,因此您可以从此处了解详情。