App.config (или ApplicationName.exe.config) работи ли в моно?

Опитвам се да накарам EntityFramework 6 с dotConnect за Oracle, работещ върху Mono. Също така имам дефинирана цялата конфигурация на приложението в раздела userSettings.

Първото нещо, което забелязах е, че приложението ми винаги има конфигурация по подразбиране, след което се опитах да накарам доставчика Devart.Data.Oracle да работи, но получих грешка:

System.Configuration.ConfigurationErrorsException: Failed to find or load the registered .Net Framework Data Provider 'Devart.Data.Oracle'.

Проверих приложението си с strace и използвах MONO_LOG_LEVEL:

MONO_LOG_LEVEL=debug mono Host.exe | grep config

И конфигурационният файл се зарежда (успешно) няколко пъти по време на стартиране на приложението.

Намерих няколко доклада за грешки относно конфигурацията в моно, но те са доста стари и не знам дали все още са актуални.

https://bugzilla.xamarin.com/buglist.cgi?quicksearch=ApplicationSettingsBase+

Бихте ли ми подсказали как да се отърва от секцията доставчик в App.config? Успях да преместя почти цялата конфигурация в код (с изключение на доставчиците).


person smokeing    schedule 25.09.2015    source източник


Отговори (1)


Първо, вашето изключение не е свързано с грешна конфигурация. Той зареди и прочете вашата конфигурация, но след това не може да намери доставчик (Devart.Data.Oracle), посочен в тази конфигурация. Най-очевидната причина за това е липсата на dll, който съдържа този доставчик.

Второ, ето как използвам доставчика на postgresql на EF6 + Devart (вие използвате Oracle, но това трябва да е подобно) на mono без никакви конфигурационни файлове:

public class PgSqlConfiguration : System.Data.Entity.DbConfiguration
{
    public PgSqlConfiguration()
    {
        SetProviderServices("Devart.Data.PostgreSql", PgSqlEntityProviderServices.Instance);
        SetProviderFactory("Devart.Data.PostgreSql", PgSqlProviderFactory.Instance);
    }
}

След това маркирайте контекста си с атрибут DbConfigurationType по следния начин:

[DbConfigurationType(typeof(PgSqlConfiguration))]
public partial class YourContext : DbContext {}

Просто заменете доставчиците на PostgreSql с Oracle в кода по-горе (и не забравяйте да добавите липсваща dll, ако случаят е такъв) и трябва да сте добре.

person Evk    schedule 25.09.2015
comment
Благодаря за отговора. Направих това с помощта на предварително дефинираната DbConfiguration на DevArt по време на зареждане на асемблиране: DbConfiguration.SetConfiguration(new Devart.Data.Oracle.Entity.OracleEntityProviderServicesConfiguration()); защото при използване на атрибут получих изключение: Екземплярът на DbConfiguration по подразбиране е използван от Entity Framework преди да бъде открит типът. - person smokeing; 26.09.2015