【发布时间】:2011-04-27 05:41:58
【问题描述】:
我试图弄清楚如何使用新的 EF Code First 东西,但我无法弄清楚如何将 Include 功能调整为半通用的存储库类。 (我说半通用,因为该类不是通用的,只是方法。所以我有一个存储库,它本质上包装了一个聚合,并且您可以与属于该聚合的所有实体进行交互,而不仅仅是单个实体。 )
我的情况是我有一个实体,它有一个 总是 需要加载的子实体,然后是其他可选加载的子实体,我想在我的存储库方法中包含一个简单的 bool 参数.像这样:
public S GetByID<S>(int entityID, bool loadChildren = false) where S : class
{
DbSet<S> set = _context.Set<S>();
if (loadChildren)
set = FullInclude<S>(set);
else
set = DefaultInclude<S>(set);
return set.Find(entityID);
}
protected virtual DbSet<S> DefaultInclude<S>(DbSet<S> set) where S : class
{
// base implementation just returns the set
// derived versions would attach Includes to the set before returning it
return set;
}
protected virtual DbSet<S> FullInclude<S>(DbSet<S> set) where S : class
{
// base implementation just returns the set
// derived versions would attach Includes to the set before returning it
return set;
}
这是我的基础存储库,我希望能够覆盖派生类中的那些XyzInclude 方法。但是我需要用非泛型实现覆盖它们,这显然在语言级别上不起作用。
使用 Linq2Sql 非常简单,我只需配置一个 DataLoadOptions 对象并将其附加到上下文中。使用Include API 关闭DbSet,我不知道如何最好地做到这一点。我正在寻找有关策略模式或类似模式的简单实现的建议。
编辑:我想我的问题的本质实际上是关于用非泛型派生版本覆盖泛型方法。我正在寻找一种允许我这样做的模式或技术。扩展方法是我正在研究的一件事,但如果有人有的话,我更喜欢更“纯粹”的解决方案。
【问题讨论】:
标签: c# ef-code-first eager-loading