2017-09-21 45 views
0

的類型派生的DbContext我有兩個類從的DbContext我怎樣才能從TEntity

public class AContext : DbContext 
{ 
    DbSet<A> A { get; set; } 
} 

public class BContext : DbContext 
{ 
    DbSet<B> B { get; set; } 
    DbSet<C> C { get; set; } 
} 

我怎樣才能通過的typeof(A/B/C)或typeof運算(獲得指定的上下文中繼承DbSet'<'A/B/C'>'))?

+1

EF數據實體只是POCO;這個實體和上下文之間並沒有真正的聯繫。你現在想完成什麼? –

+0

我有一個通用的存儲庫,如Rpository ,T是實體類,現在我想通過構造函數中的typeof(T)來獲取指定的dbContext。 –

回答

0

簡短的回答:你不能,一般來說,因爲它很可能有一個ABContext一個BCContext - 你想從類型B找哪個?

如果你限制你自己到同一類型從未被多個上下文類型(或者,至少,這對於任何類型的,你會作爲搜索輸入使用的是真實的)處理的情況下,你可以只得到所有類型在程序集中,篩選出繼承DbContext並且具有正確類型的屬性,然後選擇匹配的屬性。

typeof(ABContext).GetTypeInfo().Assembly.Types 
    .Select(t => t.GetTypeInfo()) 
    .Where(t => typeof(DbContext).IsAssignableFrom(t)) 
    .Where(t => t.Properties.Any(p => p.Type == yourDbSetType)) 
    .Single(); 

(輸入我的手機上,所以很可能有一些拼寫錯誤或不正確調用BCL功能。我會仔細檢查,當我在電腦...)

但你是什麼希望通過這個來完成?把所有的數據集放在一個上下文中是不是更好?爲了避免這種需求?

+0

謝謝你的答案,我有抽象和通用的存儲庫,T是實體類,我想用DI注入IAmbientDbContextLocator,並且我的存儲庫具有屬性DataContex並返回一個DbContext類型,現在我不用不知道如何在屬性中的getter函數中編寫代碼。 _contextLoactor.Get(_dbContextType); //如何獲取dbcontextType? –

+0

如果您可以將db上下文類型暴露給客戶端代碼,那麼可以使repo類型爲'Repository ',它可以爲您提供所需的所有信息。如果您不希望客戶端代碼必須知道要使用哪種上下文類型,只需將所有數據庫集合放在一個上下文中即可。 –

+0

好的,我會嘗試將dbcontext類型暴露給服務層,謝謝Tomas。 –