簡體   English   中英

DbContext多重繼承

[英]DbContext Multiple Inheritance

EF的設計迫使開發人員繼承DbContext類。 一些可重用的庫(例如ASP.NET Identity)通常使用相同的繼承路徑(即通過提供IdentityDbContext基類)來提供其功能。

但是顯然,如果您有2個這樣的庫,則這將行不通,例如,要求您同時從IdentityDbContext和CmsDbContext繼承,這顯然在.NET上是不可能的。 我想要的結果是有一個包含我的身份模塊和我的cms模塊中的模型的application-dbcontext(我無法將其分為2個dbcontext,因為那將意味着我最終將獲得多個連接,並且交易,而我的模型只能引用身份或cms實體,而不能同時引用兩者)。

很難相信這個問題似乎並未在EF社區中問到,但這似乎是一個糟糕透頂的ORM設計。 繼承僅允許您進行嚴格的線性模塊化。 (作為比較,在NHibernate中,ISession和您的Configuration是兩個獨立的事物,因此您可以使用發現過程從不同的不相關模塊中構建映射配置,而無需弄亂我的ISession以及我的數據庫連接/事務)。

因此,問題是,假設您是一個模塊的開發人員,該模塊希望將模型注冊到實體框架中(類似於ASP.NET身份模塊),那么您將不希望使用應用程序必須具有基本的DbContext。繼承,因為這將阻止它們使用其他模塊(例如,ASP.NET標識的IdentityDbContext)。 那我有什么選擇呢? 有什么方法可以將模型注冊到DbContext類中,而無需繼承DbContext? 重寫OnModelCreating是訪問ModelBuilder的唯一方法嗎?

我認為您的比較不完全公平。 (盡管我是第一個承認NHibernate在許多方面都勝過EF的人)。

使用NHibernate,通常可以通過某種通用方法來加載對象,在其中提供要加載的類型。 可以使用硬編碼的Query<T> (或QueryOver<T> )屬性創建ISession實現,例如...

public Query<MyUser> Users { get; set; }

...您將遇到無法合並或繼承兩個不同實現的相同“問題”。

同樣,您可以通過僅使用context.Set<T>加載對象來使用EF。 您甚至可以通過在上下文的構造函數中提供EntityTypeConfiguration類(作為列表)來注入配置(某種),將它們存儲在成員變量中,然后將它們添加到OnModelCreating重寫中的模型構建器中。

這些專門的上下文類(例如IdentityDbContext )可讓您輕松適應生活。 它們具有硬編碼的DbSet屬性(以及其他屬性)。 您不能多重繼承它們的事實並不是設計缺陷。 這只是(不可商議的)語言規范。

選擇最能滿足您需求的一個(最好是CmsDbContext ),然后自己添加其他類映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM