powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Совет про контекст базы данных - создание в контроллерах
25 сообщений из 65, страница 1 из 3
Совет про контекст базы данных - создание в контроллерах
    #40001617
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужен совет, на сколько корректно так делать. Есть решение с несколькими проектами: My.Dictionary, My.Shared, My.Book, My.Stored и так далее. Все они содержат свои модели данных для Entity Framework. В Dictionary и Shared при этом некие общие, нужные другим проектам. Теперь для каждого проекта у меня получается свой контекст БД, например для My.Book:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class BookContext : DataContext<DbContext>, IDictionaryDbContext
{
    // Из текущего проекта
    public DbSet<Book> Books { get; set; }
    public DbSet<Author> Authors { get; set; }

    // Справочники из My.Dictionary
    public DbSet<BookType> BookTypes { get; set; }
    ...
}


Проблема: теперь в контроллере проекта My.Book я явно должен вызывать создание нужного контекста и передавать его в используемые в этом контроллере репозитории:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public abstract class BaseController<TContext> : Controller where TContext : DbContext
{
    protected TContext Context { get; set; }
}

public class BookController : BaseController<BookContext>
{
    public BookController(DbContextOptions options)
    {
        Context = new BookContext(options);
    }      
      
    public async Task<IActionResult> Index()
    {
        var repo = new Repositories.BookRepository(Context);                       
        ...
        return View();
    }
}


А в вместо такого (проброс контекста через DI):
Код: c#
1.
2.
services.AddDbContext<ApplicationContext>(options =>
    options.UseNpgsql(onfiguration.GetConnectionString("ConnStr")));


пришлось написать такое (пробрасываем сами опции):
Код: c#
1.
2.
3.
var contextOptions = new DbContextOptionsBuilder()
    .UseNpgsql(Configuration.GetConnectionString("ConnStr")).Options;
services.AddSingleton(contextOptions);


Вопрос: нас сколько такая практика приемлема? Или надо делать один общий "ApplicationContext.cs", куда добавлять все DbSet из всех проектов? Описанное выше - попытка сделать контекст БД максимально заточенный для конкретного проекта в решении.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40001640
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

В чём смысл разных контекстов?
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40001682
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Идея в том, что, например, каждый проект закреплен за своим разработчиком, он сам делает нужные таблицы в БД, сам управляет контекстом в своем проекте. Возможно еще для чего-то. Если добавить новый проект (аля модуль), то там будет свой контекст.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40001909
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1
Идея в том, что, например, каждый проект закреплен за своим разработчиком, он сам делает нужные таблицы в БД, сам управляет контекстом в своем проекте. Возможно еще для чего-то. Если добавить новый проект (аля модуль), то там будет свой контекст.


Да хоть 100500 разработчиков. Вам не нужно больше одного контекста. Каждый разрботчик может сколько угодно своих моделей добавлять в свой "модуль" и объявлять там класс, реализующий IEntityTypeConfiguration<TEntity>, в контексте не нужно определять свойства для каждой сущности -- это колхоз. Вы всегда можете работать с контекстом через Set<TEntity>().
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40001915
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть такой общий контекст - это колхоз? А было б удобно, наверно. Его можно через DI в ConfigureServices прокинуть во все контроллеры всех проектов (в решении один из проектов - Asp.Net Web application, а все остальные - ClassLibrary).

public class ApplicationContext : DbContext
{
// Все из проекта My.Dictionary
public DbSet<My.Dictionary.Name> Names { get; set; }
...

// Все из проекта My.Shared
public DbSet<My.Shared.ClassName> ClassNames { get; set; }
...
}

Тогда что указывать в:

Код: c#
1.
2.
services.AddDbContext<ApplicationContext /* ??? */>(options =>
    options.UseNpgsql(onfiguration.GetConnectionString("ConnStr")));



>> объявлять там класс, реализующий IEntityTypeConfiguration<TEntity>
Ну я так понимаю, такие классы полезны, если есть что конфигурировать с помощью Fluent API, типа такого:
builder.ToTable("ClassName").HasKey(p => p.Id);
Но свойства DbSet все равно должно же быть в контексте?
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40001916
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1
// Все из проекта My.Dictionary
public DbSet<My.Dictionary.Name> Names { get; set; }
...

// Все из проекта My.Shared
public DbSet<My.Shared.ClassName> ClassNames { get; set; }


Это не нужно делать.
Данные свойства -- лишние.


Qwe.Qwe1
Тогда что указывать в:

Код: c#
1.
2.
services.AddDbContext<ApplicationContext /* ??? */>(options =>
    options.UseNpgsql(onfiguration.GetConnectionString("ConnStr")));



<AppicationContext> и всё, чего вам ещё нужно-то? :)
Один контекст.


Qwe.Qwe1
>> объявлять там класс, реализующий IEntityTypeConfiguration<TEntity>
Ну я так понимаю, такие классы полезны, если есть что конфигурировать с помощью Fluent API, типа такого:
builder.ToTable("ClassName").HasKey(p => p.Id);
Но свойства DbSet все равно должно же быть в контексте?


Нет, не должны.
У вас два варианта по сути:
1. Свойства DbSet в контексте -- колхоз, удобно на мизерных проектах для скорости.
2. IEntityTypeConfiguration<TEntity> и регистрация таких классов со всех сборок.

Для модульного решения только 2.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40001996
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так? В основой проект "WebAppContext.Web" я добавил в зависимости 2 других проекта (Dictionary, Book). А как этот контекст получить в контроллерах этих проектов? В конструкторе надо же указать ApplicationContext, а это не работает: "The type or namespace name 'ApplicationContext' could not be found (are you missing a using directive or an assembly reference?)". Добавить ссылку на проект нельзя - получаются "circular dependency".

Вот проект:




Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
namespace WebAppContext.Web
{
    public class ApplicationContext : DbContext
    {
        public ApplicationContext()
        {         
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"...");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new Dic1Configuration());
            modelBuilder.ApplyConfiguration(new Dic2Configuration());
            modelBuilder.ApplyConfiguration(new Dic3Configuration());
        }
    }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
namespace WebAppContext.Dictionary
{
    public class Dic1Configuration : IEntityTypeConfiguration<Dic1>
    {
        public void Configure(EntityTypeBuilder<Dic1> builder)
        {            
        }
    }
}
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40001998
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

Посмотрите в сторону modelBuilder.ApplyConfigurationsFromAssembly
не обязательно указывать их вручную, также это можно обеспечить через DI
и каждый модуль сам может зарегать свои типы
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002001
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как быть с контекстом? Вот так не работает:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
namespace WebAppContext.Book.Areas.Book.Controllers
{
    [Area("book")]
    public class HomeController : Controller
    {
        public HomeController(ApplicationContext context)
        {
            // ApplicationContext ??
        }
        
        public IActionResult Index()
        {
            return View();
        }
    }
}
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002006
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1
А как быть с контекстом? Вот так не работает:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
namespace WebAppContext.Book.Areas.Book.Controllers
{
    [Area("book")]
    public class HomeController : Controller
    {
        public HomeController(ApplicationContext context)
        {
            // ApplicationContext ??
        }
        
        public IActionResult Index()
        {
            return View();
        }
    }
}



не совсем понял, что не работает, и что значат вопрсоики в комментарии? присвойте ссылку на контекст приватной переменной и работайте с ней в экшенах.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002007
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002009
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не работает, потому что:
"The type or namespace name 'ApplicationContext' could not be found (are you missing a using directive or an assembly reference?)""
Это контроллер не в основном проекте, где и лежит класс "ApplicationContext", а в одном из проектов. И как это исправить?
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002040
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Qwe.Qwe1,

Добавьте ссылку на проект и using для namespace в котором лежит ApplicationContext.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002047
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже добавил в основной проект ссылки на 2 других проекта ("модуля"). Теперь если попытаться добавить в проект ("модуль") ссылку на основной проект - будет такая ошибка (я об этом упоминал выше):

...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002051
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит ты сотворил фигню со слоями своего приложения
Слой должен зависеть от нижестоящего, и не должен зависеть от вышестоящего. А ты кашу сделал. Начни рисования схемы своего приложения.

Скорее всего, тебе нужно контекст вынести в отдельный проект, контекст не должен зависеть от Web
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002111
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, действительно, если вынести класс с контекстом в отдельный проект, то работает. К вопросу о схеме приложения: чтобы в итоге заработало, пришлось ввести такое ограничение. Проект со словарем, например, разбить на 2: первый хранит данные с моделями и предназначен только для работы с БД. Второй содержит контроллеры, где идет работы со словарем. Не колхоз? )
Вот структура проекта:


...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002117
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не зная, что ты подразумеваешь под словарем, ответить на вопрос нельзя. Если ты что-то вынужденно разбил на две части, значит пока еще есть проблемы в архитектуры. Рисуй зависимости модулей друг от друга. Из этого скрина все равно ничего не ясно.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002130
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, порисую-подумаю на счет разделения. Уже хорошо, что отторжения не вызывает) Да, теперь вместо указания всех сущностей из всех проектов в стиле DbSet<> я пишу для каждой modelBuilder (выше упоминали про возможность рефлексии по сборкам, пока так) и еще и контекст - один класс - в собственно проекте. Надеюсь, что это не вызовет проблем в будущем, например, если реализовывать репозиторий тот же.

И еще - контекст содержит все сущности всех проектов, насколько это не утяжеляет его? Не скажется это скорости EF?
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002141
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1
И еще - контекст содержит все сущности всех проектов, насколько это не утяжеляет его? Не скажется это скорости EF?


Не скажется.
Регистрируете все конфигурации через DI.
Потом из DI достаёте и регистрируете в ApplicationContext.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002151
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt

Регистрируете все конфигурации через DI.
Потом из DI достаёте и регистрируете в ApplicationContext.


А можно пример? Спасибо.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002157
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

Поищите как зарегистрировать все реализации интерфейса (дженерик) из сборки.
Затем в модель билдер вытащите все реализации через ServiceProvider и зарегистрируйте их.
Так у вас реализация контекста будет неизменной независимо от количество модулей и сборок.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002160
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, посмотрю. Но это все направлено на то, чтобы не писать в методе OnModelCreating контекста 10-50-100 строк вида:
modelBuilder.ApplyConfiguration(new Dic1Configuration());
а автоматизировать этот процесс? Но в результате, что вручную, что после такой автоматики контекст будет выглядеть одинаково, ведь так?
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002163
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1
Ок, посмотрю. Но это все направлено на то, чтобы не писать в методе OnModelCreating контекста 10-50-100 строк вида:
modelBuilder.ApplyConfiguration(new Dic1Configuration());
а автоматизировать этот процесс? Но в результате, что вручную, что после такой автоматики контекст будет выглядеть одинаково, ведь так?


Да, всё верно. Напишите что у вас получилось в результате исследований, я подкорректирую и поправлю если нужно. Мне сейчас сложно дать вам пример, так как я в другом контексте нахожусь )
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002167
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, постараюсь в ближайшее время.
...
Рейтинг: 0 / 0
Совет про контекст базы данных - создание в контроллерах
    #40002295
borkes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
фи, работать с БД в контроллерах. Провайдеры пилите и в них в базу лазьте.
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 1 из 3
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Совет про контекст базы данных - создание в контроллерах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]