2013-12-10 58 views
1

我正在使用EF6 ObjectContext生成器,這意味着我們的實體從EntityObject繼承。實體框架:context.CreateObjectSet <T>派生實體問題

我想爲簡單的CRUD操作實現一個通用的存儲庫,但是當涉及派生實體時我遇到了一個特定的問題。儘管進行了許多不同的嘗試,但我無法獲得正確的代碼來處理這一般情況!

public DataRepository(ObjectContext context) 
    { 
     _context = context; 
     _objectSet = _context.CreateObjectSet<T>(); 

     Type baseType = GetBaseEntityType(); 

     if (baseType == typeof(T)) 
      _objectSet = _context.CreateObjectSet<T>(); 
     else 
      // how to create the objectset here? 
      // I have tried the below but it blows up at runtime with an invalid cast exception 
      _objectSet = (IObjectSet<T>)Activator.CreateInstance(typeof(ObjectSetProxy<,>).MakeGenericType(typeof(T), baseType), context); 
    } 

我已經通過

Entity Framework: ObjectSet and its (generics) variance

閱讀但這似乎在得到一個的ObjectQuery而不是ObjectContext的成爲目標。任何幫助不勝感激。 :o)

更新:如果沒有任何干淨的解決方案,這是否有任何變通辦法人們可以想到的?我考慮了一個自動生成的派生實體列表,並對類型等進行了檢查,但由於它是一個通用的repo,因此它最終必須使用IObjectSet,所以下面的行無論如何都無法通過無效轉換_objectSet =(IObjectSet)_context.CreateObjectSet();

回答

0

This可能是感興趣的。我不知道在版本6中行爲是否發生了變化。

+0

謝謝,但我已經閱讀過,並沒有幫助我出來恐怕。 –

0

我已經完成了自己的整理。傳入基礎實體和派生實體(我們只有一個級別的繼承)。下面是它的外觀的情況下,其他人一個口味需要一個指向....

公共類DataRepository:IRepository 其中TBaseEntity:EntityObject 其中TDerivedEntity:TBaseEntity { 保護靜態耳鼻喉科CTX {{返回DBContextManager。 GetDBContext();}}

private ObjectContext _context; 
    private readonly ObjectSet<TBaseEntity> _objectSet; 
    public DataRepository(): this(DBContextManager.GetDBContext()){} 

    public DataRepository(ObjectContext context) 
    { 
     _context = context; 
     _objectSet = _context.CreateObjectSet<TBaseEntity>(); 
    } 

    private ObjectQuery<TDerivedEntity> TypedObjectSet 
    { 
     get 
     { 
      return _objectSet.OfType<TDerivedEntity>(); 
     } 
    } 

    public IEnumerable<TDerivedEntity> Find(Expression<Func<TDerivedEntity, bool>> predicate) 
    { 
     return TypedObjectSet.Where(predicate); 
    } 

    public TDerivedEntity Single(Func<TDerivedEntity, bool> predicate) 
    { 
     return TypedObjectSet.Single(predicate); 
    } 

    // etc etc