|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Нужен совет, на сколько корректно так делать. Есть решение с несколькими проектами: 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.
Проблема: теперь в контроллере проекта My.Book я явно должен вызывать создание нужного контекста и передавать его в используемые в этом контроллере репозитории: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
А в вместо такого (проброс контекста через DI): Код: c# 1. 2.
пришлось написать такое (пробрасываем сами опции): Код: c# 1. 2. 3.
Вопрос: нас сколько такая практика приемлема? Или надо делать один общий "ApplicationContext.cs", куда добавлять все DbSet из всех проектов? Описанное выше - попытка сделать контекст БД максимально заточенный для конкретного проекта в решении. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 12:33 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, В чём смысл разных контекстов? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 13:12 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Идея в том, что, например, каждый проект закреплен за своим разработчиком, он сам делает нужные таблицы в БД, сам управляет контекстом в своем проекте. Возможно еще для чего-то. Если добавить новый проект (аля модуль), то там будет свой контекст. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 14:10 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1 Идея в том, что, например, каждый проект закреплен за своим разработчиком, он сам делает нужные таблицы в БД, сам управляет контекстом в своем проекте. Возможно еще для чего-то. Если добавить новый проект (аля модуль), то там будет свой контекст. Да хоть 100500 разработчиков. Вам не нужно больше одного контекста. Каждый разрботчик может сколько угодно своих моделей добавлять в свой "модуль" и объявлять там класс, реализующий IEntityTypeConfiguration<TEntity>, в контексте не нужно определять свойства для каждой сущности -- это колхоз. Вы всегда можете работать с контекстом через Set<TEntity>(). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 23:32 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
То есть такой общий контекст - это колхоз? А было б удобно, наверно. Его можно через 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.
>> объявлять там класс, реализующий IEntityTypeConfiguration<TEntity> Ну я так понимаю, такие классы полезны, если есть что конфигурировать с помощью Fluent API, типа такого: builder.ToTable("ClassName").HasKey(p => p.Id); Но свойства DbSet все равно должно же быть в контексте? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 00:07 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
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.
<AppicationContext> и всё, чего вам ещё нужно-то? :) Один контекст. Qwe.Qwe1 >> объявлять там класс, реализующий IEntityTypeConfiguration<TEntity> Ну я так понимаю, такие классы полезны, если есть что конфигурировать с помощью Fluent API, типа такого: builder.ToTable("ClassName").HasKey(p => p.Id); Но свойства DbSet все равно должно же быть в контексте? Нет, не должны. У вас два варианта по сути: 1. Свойства DbSet в контексте -- колхоз, удобно на мизерных проектах для скорости. 2. IEntityTypeConfiguration<TEntity> и регистрация таких классов со всех сборок. Для модульного решения только 2. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 00:37 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Вот так? В основой проект "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.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 10:33 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, Посмотрите в сторону modelBuilder.ApplyConfigurationsFromAssembly не обязательно указывать их вручную, также это можно обеспечить через DI и каждый модуль сам может зарегать свои типы ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 10:42 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
А как быть с контекстом? Вот так не работает: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 10:48 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1 А как быть с контекстом? Вот так не работает: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
не совсем понял, что не работает, и что значат вопрсоики в комментарии? присвойте ссылку на контекст приватной переменной и работайте с ней в экшенах. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 10:55 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, гляньте вот на этот топик: https://stackoverflow.com/questions/59753218/how-to-use-dbcontext-in-separate-class-library-net-core ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 10:56 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Не работает, потому что: "The type or namespace name 'ApplicationContext' could not be found (are you missing a using directive or an assembly reference?)"" Это контроллер не в основном проекте, где и лежит класс "ApplicationContext", а в одном из проектов. И как это исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 10:58 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, Добавьте ссылку на проект и using для namespace в котором лежит ApplicationContext. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:43 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Я уже добавил в основной проект ссылки на 2 других проекта ("модуля"). Теперь если попытаться добавить в проект ("модуль") ссылку на основной проект - будет такая ошибка (я об этом упоминал выше): ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:51 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Значит ты сотворил фигню со слоями своего приложения Слой должен зависеть от нижестоящего, и не должен зависеть от вышестоящего. А ты кашу сделал. Начни рисования схемы своего приложения. Скорее всего, тебе нужно контекст вынести в отдельный проект, контекст не должен зависеть от Web ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:58 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Shocker.Pro, действительно, если вынести класс с контекстом в отдельный проект, то работает. К вопросу о схеме приложения: чтобы в итоге заработало, пришлось ввести такое ограничение. Проект со словарем, например, разбить на 2: первый хранит данные с моделями и предназначен только для работы с БД. Второй содержит контроллеры, где идет работы со словарем. Не колхоз? ) Вот структура проекта: ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:20 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Не зная, что ты подразумеваешь под словарем, ответить на вопрос нельзя. Если ты что-то вынужденно разбил на две части, значит пока еще есть проблемы в архитектуры. Рисуй зависимости модулей друг от друга. Из этого скрина все равно ничего не ясно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:26 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Хорошо, порисую-подумаю на счет разделения. Уже хорошо, что отторжения не вызывает) Да, теперь вместо указания всех сущностей из всех проектов в стиле DbSet<> я пишу для каждой modelBuilder (выше упоминали про возможность рефлексии по сборкам, пока так) и еще и контекст - один класс - в собственно проекте. Надеюсь, что это не вызовет проблем в будущем, например, если реализовывать репозиторий тот же. И еще - контекст содержит все сущности всех проектов, насколько это не утяжеляет его? Не скажется это скорости EF? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:47 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1 И еще - контекст содержит все сущности всех проектов, насколько это не утяжеляет его? Не скажется это скорости EF? Не скажется. Регистрируете все конфигурации через DI. Потом из DI достаёте и регистрируете в ApplicationContext. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 14:18 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
hVostt Регистрируете все конфигурации через DI. Потом из DI достаёте и регистрируете в ApplicationContext. А можно пример? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 14:30 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, Поищите как зарегистрировать все реализации интерфейса (дженерик) из сборки. Затем в модель билдер вытащите все реализации через ServiceProvider и зарегистрируйте их. Так у вас реализация контекста будет неизменной независимо от количество модулей и сборок. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 14:43 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Ок, посмотрю. Но это все направлено на то, чтобы не писать в методе OnModelCreating контекста 10-50-100 строк вида: modelBuilder.ApplyConfiguration(new Dic1Configuration()); а автоматизировать этот процесс? Но в результате, что вручную, что после такой автоматики контекст будет выглядеть одинаково, ведь так? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 14:51 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Qwe.Qwe1 Ок, посмотрю. Но это все направлено на то, чтобы не писать в методе OnModelCreating контекста 10-50-100 строк вида: modelBuilder.ApplyConfiguration(new Dic1Configuration()); а автоматизировать этот процесс? Но в результате, что вручную, что после такой автоматики контекст будет выглядеть одинаково, ведь так? Да, всё верно. Напишите что у вас получилось в результате исследований, я подкорректирую и поправлю если нужно. Мне сейчас сложно дать вам пример, так как я в другом контексте нахожусь ) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 14:57 |
|
Совет про контекст базы данных - создание в контроллерах
|
|||
---|---|---|---|
#18+
Спасибо, постараюсь в ближайшее время. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 15:03 |
|
|
start [/forum/topic.php?fid=18&fpage=5&tid=1354625]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 139ms |
0 / 0 |