Как управлять соединениями при использовании DbModelBuilder в Entity Framework? - PullRequest
1 голос
/ 20 ноября 2011

Я пишу оболочку IRepository и IUnitOfWork для схемы EF4 Fluent.

В этом проекте 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 на протяжении всего жизненного цикла приложения, либо создать кратковременный DbConnection только для процесса построения модели, а новый DbConnection - при создании DbContext.

Есть ли более эффективный способ управления соединениями, который я пропустил?

1 Ответ

0 голосов
/ 20 ноября 2011

Само соединение требуется только для идентификации провайдера ADO.NET и токена манифеста. Метод Build имеет перегруженную версию, принимающую экземпляр DbProviderInfo. Эта перегрузка внутренне вызывается перегрузкой, принимающей DbConnection. Так что вы можете вызвать версию с DbProviderInfo напрямую, если вам не нравится версия с DbConnection.

Не используйте EF, если вы знаете, что позже вам потребуется еще один ORM. Разработка приложения для поддержки нескольких ORM возможна только в том случае, если вы знаете все из них uppfront и разрабатываете свое приложение так, чтобы оно использовало только общие функции между ними. ИМХО поддержка более одного ORM никогда не нужна, и замена ORM всегда означает изменения в приложении.

...