我爲我的應用程序創建數據訪問層時遇到了問題。我正在使用實體框架中的派生實體。如果我嘗試爲派生實體創建一個ObjectSet,我得到以下例外:實體框架非泛型在動態ObjectSet上包含
Blockquote沒有爲指定的實體類型「類型名稱」定義EntitySets。如果「類型名稱」是派生類型,請改爲使用基本類型。
我試圖通過反射來解決這個問題。 (如果實體類型由實體類型派生=>獲得基類型的ObjectSet)
我發現這個:How can I obtain ObjectSet<T> from Entity-Framework at runtime where T is dynamic?但我還沒有找到如何使用Include和Where構建ObjectSet。
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中使用動態表達式?
在此先感謝。
我發現這個:http://stackoverflow.com/questions/2789504/get-the-property-as-a-string-from-an-expressionfunctmodel-tproperty。這可以將表達式轉換爲字符串。結合您的解決方案,它允許包含未知的EntityType。非常感謝。 –