Как заставить поставщика типов Entity Framework использовать файл конфигурации среды выполнения?

У меня есть проект библиотеки F#, который я использую из веб-проекта C#. Я хотел бы использовать Entity Framework Type Provider в моем проекте F # и получить строку подключения из Web.config, но у меня возникли проблемы с его работой.

type internal FooDb = 
    SqlEntityConnection<ConnectionStringName="FooDb", Pluralize=true>

Во время разработки мне необходимо иметь файл App.config в проекте библиотеки F# со строкой подключения, имеющей соответствующее имя.

Во время выполнения при вызове моего кода F# из веб-проекта C# я получаю сообщение об ошибке, что не может найти файл App.config. Это меня удивляет, потому что я ожидал, что во время выполнения он просто будет использовать ConfigurationManager.ConnectionStrings для загрузки строки подключения из текущего активного файла конфигурации (в случае веб-приложения Web.config). Однако, похоже, это не так.

Я попытался добавить параметр ConfigFile:

type internal FooDb = 
    SqlEntityConnection<ConnectionStringName="FooDb", ConfigFile="Web.config", Pluralize=true>

Но это только заставило его жаловаться во время разработки, что он не может найти Web.config.

Затем я переименовал файл App.config в проекте библиотеки F# в Web.config, и, похоже, все заработало. Тем не менее, я беспокоюсь об этом решении. Это действительно так, как это должно работать? У меня должен быть файл web.config в моем проекте библиотеки? Что бы я сделал, если бы хотел использовать ту же библиотеку из исполняемого файла командной строки, и в этой среде файл конфигурации называется AssemblyName.exe.config?

Принуждение меня к жесткому кодированию имени файла конфигурации, который может иметь разные имена в разных контекстах, кажется очень хрупким и плохим дизайном. Пожалуйста, скажите мне, что я что-то упустил.


person Joel Mueller    schedule 20.12.2012    source источник


Ответы (1)


Проблема, с которой вы столкнулись, кажется довольно досадной, и я не знаю, упускаете ли вы что-то или нет. Однако в документации SqlEntityConnection говорится, что FooDb должен иметь перегрузку GetDataContext, в которой "параметр connectionString может использоваться, когда строка подключения определяется во время выполнения". Возможно, это даст вам достаточно приличную работу (т.е. передать строку подключения от ConfigurationManager.ConnectionStrings самостоятельно).

person Stephen Swensen    schedule 22.12.2012