【发布时间】:2013-07-17 14:16:55
【问题描述】:
我在为我的应用程序创建数据访问层时遇到了问题。我正在使用实体框架中的派生实体。如果我尝试为派生实体创建 ObjectSet,则会收到此异常:
Blockquote 没有为指定的实体类型“类型名称”定义实体集。如果“类型名称”是派生类型,请改用基类型。
我已尝试通过反射解决此问题。 (如果实体类型是由实体类型派生的 => 获取基本类型的 ObjectSet)
我找到了这个:How can I obtain ObjectSet<T> from Entity-Framework at runtime where T is dynamic?,但我还没有找到如何在构建的 ObjectSet 上使用 Include 和 Where。
protected IEnumerable<IDataObject> GetData(Type entityType, Expression<Func<dynamic, bool>> whereClause, Expression<Func<dynamic, dynamic>>[] includes)
{
if (typeof(IDataObject).IsAssignableFrom(entityType.BaseType))
{
return GetData(entityType.BaseType, whereClause, includes);
}
var contextType = this.Context.GetType();
MethodInfo createObjectSetMethod = contextType.GetMethod("CreateObjectSet", new Type[] {}).MakeGenericMethod(entityType);
// Builds up an ObjectSet<EntityType>
dynamic objectSet = createObjectSetMethod.Invoke(this.Context, new object[] { });
dynamic query = objectSet;
if (includes != null)
{
foreach (var include in includes)
{
query = query.Include(include);
}
}
if (whereClause == null)
{
whereClause = (item) => true;
}
query = query.Where(whereClause);
return query.ToList().OfType<IDataObject>();
}
只要我不使用 Includes 和 WhereClause,代码就会按预期运行。
当我调用这个函数时,我不知道编译时解析的 ObjectSet(T 参数)。
有没有办法在泛型 ObjectSet 中使用动态表达式?
提前致谢。
【问题讨论】:
标签: entity-framework c#-4.0 generics