#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