Как определить строку подключения и поставщика базы данных в приложении C #, когда модель Entity Framework находится в выделенной библиотеке классов? - PullRequest
1 голос
/ 28 марта 2019

Я создаю набор настольных приложений (C #, .NET Framework 4.7), которые используют одну базу данных и модели.Я использую Entity Framework 6 для настройки моделей базы данных.Чтобы избежать дублирования кода (моделей), я поместил все модели в отдельный класс «базы данных».В этом классе я также определяю DbContext.

. При добавлении пакета EntityFramework через NuGet в класс «database», поставщик базы данных EF для SQLServer LocalDB также автоматически устанавливается.

Запуск приложения без дальнейшей настройки вызовет инициализацию SQLServer LocalDB и будет использоваться для подключения к базе данных.

У меня есть две проблемы с конфигурацией «конечная точка базы данных».

1) Iхотите, чтобы фактическое приложение установило строку подключения к базе данных.Таким образом, каждое приложение, которое может работать на разных компьютерах, может иметь собственную строку подключения к базе данных, указывающую на один и тот же сервер базы данных.

Для этого я изменил свой текущий DbConext в классе «database» наследующее:

public class MyDbContext : DbContext
{
    public MyDbContext(string connectionString)
    {
        this.Database.Connection.ConnectionString = connectionString;
    }
}

Теперь я могу определить строку подключения к базе данных через приложение, а не общий класс "database".

2) Я хочу определить механизм базы данных на уровне приложения,Так что я могу создать класс «database» как «универсальный класс» и определить того фактического поставщика базы данных EF, который также будет использоваться в приложении.

Как мне изменить мой общий класс «database» иприложения, позволяющие приложению решать, какой поставщик базы данных EF следует использовать?

Ответы [ 3 ]

0 голосов
/ 28 марта 2019

Вы можете предоставить интерфейс для вашего DBContext. Затем используйте фабричный шаблон для создания правильного контекста, используя соответствующий поставщик. У Microsoft есть хороший пример:

https://github.com/Microsoft/InventorySample/tree/master/src

0 голосов
/ 29 марта 2019

EF поддерживает это "из коробки" через app.config / web.config, используя раздел <connectionStrings>.

В приложении app.config добавьте:

Затем в свой DbContextclass:

public class MyDbContext : DbContext
{
    public MyDbContext() 
        : base("ApplicationDatabase")
    { }

    public MyDbContext(string connectionString) 
        : base(connectionString)
    { }
}

Таким образом, каждый экземпляр клиента может настраивать свою строку подключения во время выполнения, настраивая строку подключения "ApplicationDatabase" в файле MyApplication.exe.config для приложений Windows.В приведенном выше коде по умолчанию используется строка подключения «ApplicationDatabase», если строка или параметр подключения не указана, или вы можете создать код с данной строкой подключения или настройкой строки подключения.

0 голосов
/ 28 марта 2019

Предполагая, что вы используете Asp net Core.

Вот как должен выглядеть ваш startup.cs.

       public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors();
            services.AddMvc();

            services.AddDbContext<MyDbContext>(op => op.UseSqlServer(Configuration["DbConnection"]));
       }

Вот так должен выглядеть ваш конструктор DbContext.

public RipBookDbContext(DbContextOptions<RipBookDbContext> options) : base(options)
{

}

Ваша строка подключения будет сохранена в appSettings.json как

"DbConnection": "Data Source=.;Initial Catalog=DbName;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"

После этого вы можете внедрить ваш класс DbContext в любое место, где хотите его использовать.

...