我一直在为EF4工作并完成了很多工作并且它的工作非常好,我遇到的一个问题是:Context.CreateQuery正确返回,但它也加载了所有相关的实体!?
一旦数据库实际上有实际数据,这将导致大量问题。
关于如何阻止它加载所有相关实体的任何想法?
这是我所拥有的片段:
原始电话:
public ObjectNameHere GetById(Guid id)
{
return Query(p => p.Id == id).SingleOrDefault();
}
提供者基础
private static Type GetBaseType(Type type)
{
var baseType = type.BaseType;
if (baseType != null && baseType != typeof(EntityObject))
{
return GetBaseType(type.BaseType);
}
return type;
}
private static bool HasBaseType(Type type, out Type baseType)
{
var originalType = type.GetType();
baseType = GetBaseType(type);
return baseType != originalType;
}
private IQueryable<T> CreateQuery<T>()
{
Type baseType;
return HasBaseType(typeof(T), out baseType)
? Context.CreateQuery<T>(ProviderHelper.GetEntitySetName(Context, baseType.Name)).OfType<T>()
: Context.CreateQuery<T>(ProviderHelper.GetEntitySetName(Context, baseType.Name));
}
提供者助手
public static string GetChildTypeNames(Type[] childTypes)
{
var context = ContextProvider.Context;
var childNames = new StringBuilder();
for (var i = 0; i < childTypes.Count(); i++)
{
childNames.Append(GetEntitySetName(context,childTypes[i].Name));
if (i != childTypes.Count()) { childNames.Append("."); }
}
return childNames.ToString();
}
public static string GetEntitySetName(ObjectContext context, string entityTypeName)
{
var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
return (from meta in container.BaseEntitySets
where meta.ElementType.Name == entityTypeName
select meta.Name).FirstOrDefault();
}
答案 0 :(得分:0)
詹姆斯,我知道你解决了这个问题,但是你也试着看看你是否可以使用部分选择方法(我认为在EF中),例如Skip&amp;取。
我必须承认,我经常忘记延迟加载,但从长远来看,它永远不会是一个问题,因为我从来没有从数据库中获取更多的东西。
只是一个想法......
我更像是一个L2S人......
嘿...
答案 1 :(得分:0)
感谢所有回复,我通过包含以下内容获得了它的工作:
Context.ContextOptions.LazyLoadingEnabled = false;
在基类的CreateQuery方法中,这个工作,(我在80%肯定之前尝试过这个)
但是哦,好吧:)。