我正在使用 VS2010 .Net4 Linq-to-EntityFramework 并希望显式加载一些子数据。我想提供类似于DataLoadOptions或LoadWith的功能,这些功能可用于 Linq-to-SQL IIUC,但不适用于 Linq-to-EF。
(顺便说一句,这样我可以记录数据以便稍后在测试期间播放。我们使用了延迟加载,我需要找到这些事件并替换为急切加载。DataLoadOptions方法将允许一种干净的方式来实现这一点.)
我正在尝试提供一种类型安全的急切加载方案,如MosesOfEgypt 博客中所述。我已经修改了 T4 的一代,并且遇到了我认为是最后一个问题。在 .Net4 中,实体属性返回ObjectSet。但不幸的是,Include函数返回ObjectQuery,它是ObjectSet的基类。
这是从修改后的 T4 模板生成的 ObjectContext 类的子集:
#region DataLoadOptions Functionality
public DataLoadOptions LoadOptions { get; set; }
private ObjectSet<TEntity> ApplyDataLoadOptions<TEntity>(string queryString) where TEntity : class
{
var query = CreateObjectSet<TEntity>(queryString);
if (LoadOptions != null)
{
var members = LoadOptions.GetPreloadedMembers<TEntity>();
foreach (var member in members)
{
********** query = query.Include(member.Name);
}
}
return query;
}
#endregion
#region ObjectSet Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Address> Addresses
{
get
{
if ((_Addresses == null))
{
_Addresses = ApplyDataLoadOptions<Address>("Addresses");
}
return _Addresses;
}
}
#endregion
以“ * ”开头的行是从ObjectQuery到ObjectSet的转换发生的地方。而且这是一个无效的向上转换,因此如果在设计时显式转换,将在运行时失败,除非我做错了。
一种解决方案可能是为ObjectSet.Include编写扩展方法,以便它返回ObjectSet而不是ObjectQuery。如果可能的话,我想知道如何找到ObjectQuery.Include函数的源代码。而且我不确定这些解决方案是否有效。
还想知道是否有办法将Include函数的结果从ObjectQuery向上转换到ObjectSet。同样,不确定这是否可行。
任何有关在 .Net4 中为 Linq-to-EF 实现 DataLoadOptions 功能的帮助将不胜感激。