2011-11-20 102 views
1

我正在爲EF4 Fluent架構編寫一個IRepositoryIUnitOfWork包裝器。如何在實體框架中使用DbModelBuilder時管理連接?

在此設計中,每個應用程序生命週期創建一個DbCompiledModel(如NHibernate ISessionFactory)。 DbCompiledModel期望現有數據庫連接,所有DbContexts

這是DbCompiledModel工廠:

public class DbCompiledModelFactory 
{ 
    public static DbCompiledModel Build(
     string mappingAssembly, DbConnection connection) 
    { 
     DbModelBuilder modelBuilder = new DbModelBuilder(); 
     AddMappingsFromAssembly(modelBuilder, mappingAssemblyName); 
     DbModel model = modelBuilder.Build(connection); 
     return model.Compile(); 
    } 
} 

一旦創建了DbCompiledModel,新DbContext可以使用new DbContext(connection, compiledModel, true)

所以我面臨兩個選擇創建:無論是共享一個DbConnection貫穿全應用程序生命週期,或創建僅用於模型構建過程的shortlived DbConnection,以及創建DbContext時創建新的DbConnection

是否有更有效的方式來管理我忽略的連接?

+0

EF緩存每個應用程序占主導地位的'DbCompiledModel'。爲什麼要複製該功能? – Eranga

+0

我想在EF的頂部有知識庫/單元工作層,因爲我可能想在以後的日期將EF替換爲另一個ORM。 – duck9

+0

你沒有回答我的問題。 ORM更換/切換將是一件非常困難的事情。你在浪費不必要的抽象時間。 – Eranga

回答

0

連接本身僅用於識別ADO.NET提供程序和清單令牌。 Build方法的重載版本接受DbProviderInfo實例。過載接受DbConnection在內部調用此過載。因此,如果您不喜歡使用DbConnection的版本,則可以直接撥打DbProviderInfo

如果您知道以後需要另一個ORM,請不要使用EF。設計應用程序以支持多個ORM只有當你知道所有這些應用程序並設計你的應用程序時,纔可能只使用它們之間的共享功能。恕我直言支持多一個ORM是永遠不需要的,替換ORM總是意味着對應用程序的更改。