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

#c# #database #entity-framework #connection-string #dbcontext

#c# #База данных #entity-framework #строка подключения #dbcontext

Вопрос:

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

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

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

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

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

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

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

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

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

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

Ответ №1:

EF поддерживает это из коробки через app.config / web.config с помощью <connectionStrings> раздела.

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

Затем в вашем классе DbContext:

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

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

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

Ответ №2:

Предполагая, что вы используете 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 в любом месте, где вы хотите его использовать.

Комментарии:

1. мы не можем предположить, что мы находимся на .net core, когда мы не

2. @Ghassen : Самир написал этот ответ до моей правки, в которой я ввел недостающую информацию об окружающей среде. Я уверен, что смогу адаптироваться к этому. Придется немного повозиться…

3. @burnersk да, вы можете сделать что-то вроде. логика net core но из того, как мы установили строку подключения, было ясно, что это не .net core

4. @Sameer Kamran, это настольное приложение

Ответ №3:

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

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