Entity Framework Core 5.0 - добавляем базу данных в проект

แชร์
ฝัง
  • เผยแพร่เมื่อ 27 ก.ย. 2024
  • Разработка ASP NET Core Web API с нуля профессионально. Видео 3. Entity Framework, добавление базы данных в проект.
    Если хотите поддержать канал: pay.cloudtips....
    Что будем делать: узнаем, как работает Entity Framework, какие есть подходы к построению базы данных в EF Core, разберем теорию работы Entity Framework'а и закрепим на практике, добавив в приложение возможность работы с базой данных.
    Мы в Telegram: t.me/platinum_...
    Чат для общения и вопросов: t.me/platinum_...
    Код из видео: github.com/and...
    Лекция ADO.NET: • ADO NET и Dapper
    Technology vector created by vectorjuice: www.freepik.co...

ความคิดเห็น • 95

  • @dannycyberwalker
    @dannycyberwalker 3 ปีที่แล้ว +10

    IRepository и UnitOfWork отдельное спасибо.

  • @sanekyakar
    @sanekyakar 2 ปีที่แล้ว +1

    Отличный формат роликов . После прочтения теории неплохо шлифует знания .

  • @neliquidmusic
    @neliquidmusic 2 ปีที่แล้ว +1

    Большое спасибо за ролики. Для начинающих очень быстро и непонятно конечно. Есть какая то литература, которая объясняет подробнее чтобы въехать в суть подробнее.

  • @ElectroJam-t7p
    @ElectroJam-t7p 2 ปีที่แล้ว +13

    А по каким таким принципам ты берешь доменную сущность Note и используешь её в DbSet? В DbSet используются сущности, которые будут маппиться на таблицы базы данных и они должны быть развязаны с доменными сущностями. Да и вообще использование DbSet уже говорит о привязке к хранению в БД. А что если завтра я захочу хранить данные в txt файле? Для этого и придумали репозитории. Есть единый интерфейс доступа к данным, который используется приложением, а реализация может меняться и ничего не поломается. Сегодня реализация хранит данные в БД, а завтра я сделаю реализацию, которая будет хранить данные на папирусе, при этом интерфейс останется тем же и можно будет просто перерегистрировать зависимость в контейнере.

    • @sergbo3114
      @sergbo3114 ปีที่แล้ว +1

      Только хотел это написать. Как бы согласен. Да и в случае использования атрибутов для EF будет проще понимать к чему это относится(т.е. EF атрибуты должны быть у EF entities). Ну да придется копировать данные из Entity сущности в Domain сущность. Но в этом суть слоистого подхода.

    • @artcoed
      @artcoed ปีที่แล้ว +1

      часто на папирусе данные храните?

    • @ElectroJam-t7p
      @ElectroJam-t7p ปีที่แล้ว +3

      @@artcoed часто делаю чистые архитектуры

    • @artcoed
      @artcoed ปีที่แล้ว

      @@ElectroJam-t7p а я не про это спрашивал

    • @artcoed
      @artcoed ปีที่แล้ว

      @Сергей Шнуров вы когда реактом пользуетесь тоже абстракции поверх него строите? А вы же можете отказаться отрепозиториев, значит поверх них тоже абстракцию стоит возводить? Не стоит отвечать на неочевидные вещи банальными ответами - в этом дело

  • @cssex2692
    @cssex2692 2 ปีที่แล้ว +4

    Великолепное обьяснение!

  • @BrownAleks
    @BrownAleks ปีที่แล้ว +16

    А что так резко сложна то стало? 😵‍💫 и без картинок. Лайк конечно за мастерство. Надеюсь дальше будет понятнее, что от куда, для чего, и зачем... 👍

    • @june3878
      @june3878 ปีที่แล้ว +2

      и раскрасок нет (

    • @fentan6806
      @fentan6806 5 หลายเดือนก่อน

      хехе, наивный

    • @BrownAleks
      @BrownAleks 5 หลายเดือนก่อน

      @@fentan6806 уже давно во всём разобрался. =)

    • @uusser273
      @uusser273 25 วันที่ผ่านมา

      @@BrownAleks как и где разобрался можно гайд?)

  • @orhanaliyev9774
    @orhanaliyev9774 2 ปีที่แล้ว

    Огромное спасибо , все понятно и по делу.

  • @777homosapien
    @777homosapien 2 ปีที่แล้ว +1

    Здравствуйте. Спасибо за видимо. Подскажите, разве бизнес логику не надо выносить отдельно что бы у нас не торчали dbset из интерфейса, например в спецификацию.? Спасибо.

  • @smrsgv
    @smrsgv 3 ปีที่แล้ว +4

    супер

  • @FunnyDony
    @FunnyDony 2 ปีที่แล้ว +1

    Здравствуйте, подскажите пожалуйста, что нужно поправить чтоб работать с SqlServer. Меняется же только строка подключения и в классе DependencyInjection проэкта Notes.Persistence
    options.UseSqlite(connectionString);
    на
    options.UseSqlServer(connectionString); или еще что-то?

  • @ПАВЕЛГрабовский-ш2з
    @ПАВЕЛГрабовский-ш2з 9 หลายเดือนก่อน

    Я не понимаю почему БД завит от application, я про интрефейс, который в application и используется в БД ?

  • @ИльяИгоревич-й8е
    @ИльяИгоревич-й8е ปีที่แล้ว +1

    Бля, вы все не понимаете насколько годную архитектуру чувак сделал.... Этот человек отказался от репо, потому что он шарит и знает что репо это антипаттерн

  • @Дмитрийсекрет-н7о
    @Дмитрийсекрет-н7о 3 ปีที่แล้ว +2

    Отлично. Но что то уроки по времени небольшие. Маловато будет, маловато ))

    • @OlegTar
      @OlegTar 3 ปีที่แล้ว +4

      10 минут оптимально

    • @mvxburov
      @mvxburov 3 ปีที่แล้ว +3

      Зато часто выходят, уж лучше так и дозированно по продолжительности, чем на 2часа и раз в 2 недели

    • @Дмитрийсекрет-н7о
      @Дмитрийсекрет-н7о 3 ปีที่แล้ว +2

      @@mvxburov Тоже логично )))

    • @PlatinumTechTalks
      @PlatinumTechTalks  3 ปีที่แล้ว +3

      тут больше зависит от концептуального разделения по темам. в итоге, где-то 5 минут ролик получается, где-то 20. но делать сильно длинные не хотелось, хотелось именно кратко и объемно

  • @dr1n
    @dr1n 2 ปีที่แล้ว +2

    Есть архитектурный изъян. Класс DbSet просочился в Application слой. Имеем зависимость Application от Infrastructure

    • @PlatinumTechTalks
      @PlatinumTechTalks  2 ปีที่แล้ว +1

      мы это принимаем. DbSet это часть EF, который в свою очередь уже абстракция. используя его мы всё еще независим от выбранной БД и это не противоречит принципам выбранной архитектуры. то есть тут нет прямой зависимости у Application от нашего Infrastructure, но у обоих из них есть использование EF, это правда

    • @МатвейЛитовченко-ч2б
      @МатвейЛитовченко-ч2б ปีที่แล้ว +1

      @@PlatinumTechTalks на мой взгляд, получилась дырявая абстракция. Ни о какой инверсии зависимостей не может идти речь, когда у нас абстракция в Application слое зависит от DbSet.
      Выходит, что Application слой напрямую вызывает методы взаимодействия с сущностью бд, проходя исключительно через абстракцию над реализацией конкретных провайдеров БД. Что не избавляет нас от того, что мы ломимся в EF

  • @rustrar2874
    @rustrar2874 2 ปีที่แล้ว +2

    Спасибо за уроки, очень полезно! Такой вопрос возник - для чего в интерфейсе INotesDBContext определен метод SaveChangesAsync? если он итак уже реализован в DbContext?

    • @vanikhachatryan3394
      @vanikhachatryan3394 2 ปีที่แล้ว

      Да, тоже не понял зачем он в интерфейсе вообще

    • @PlatinumTechTalks
      @PlatinumTechTalks  2 ปีที่แล้ว +2

      Мы DbContext используем через dependency injection и используем интерфейс INotesDbContext и методы, объявленные в нем. То есть так как мы в командах не используем DbContext напрямую, то и о методе SaveChangesAsync из DbContext’а командам ничего не известно. Тут и приходит на помощь метод из интерфейса

    • @rustrar2874
      @rustrar2874 2 ปีที่แล้ว

      @@PlatinumTechTalks Понял, спасибо за разъяснение )

    • @Desu_Desu
      @Desu_Desu 2 ปีที่แล้ว

      @@PlatinumTechTalks а как у вас студия не ругается на отсутствие реализации этого интерфейсного метода в классе?

    • @PlatinumTechTalks
      @PlatinumTechTalks  2 ปีที่แล้ว

      Реализация присутствует в базовом классе (DbContext), наш класс её наследует

  • @siera4333
    @siera4333 2 ปีที่แล้ว

    Привет, у меня вопрос. Я не совсем понимаю почему, но EF не добавляет данные в базу, точнее так - данные есть, но они не отображаются в MSSQL менеджере. При добавлении и удалении данных всё работает как надо. Но таблицы в менеджере пустые. mdf файла в папке bin\Debag у меня нет

  • @bek15071991
    @bek15071991 3 ปีที่แล้ว +1

    Подача супер! Не коротко и не мало инфы ! А может ли entity framework разделять на bounded context как в нхибернейте? Ну чтобы было несколько контекстов которые не зависят друг от друга и которые нормально мигрируются?

    • @PlatinumTechTalks
      @PlatinumTechTalks  3 ปีที่แล้ว

      Спасибо большое за отзыв!!
      Можно делать всё что угодно :) про DDD и EF можно например посмотреть этот доклад: th-cam.com/video/Z62cbp61Bb8/w-d-xo.html

  • @ОксанаМиколаївна-и4ч
    @ОксанаМиколаївна-и4ч 10 หลายเดือนก่อน

    Почему проект для БД называется Persistance?

  • @НиколайИванов-ф3э
    @НиколайИванов-ф3э 2 ปีที่แล้ว

    Все здорово, но где продолжение? Хотелось бы узнать как ConnectionString задавать таким способом и про миграции

    • @PlatinumTechTalks
      @PlatinumTechTalks  2 ปีที่แล้ว +1

      Про EF Core на канале есть отдельное видео с примерами:
      th-cam.com/video/eHayUiqBXK4/w-d-xo.html

  • @ИльяКурашов-г7ж
    @ИльяКурашов-г7ж 2 ปีที่แล้ว

    Здравствуйте! спасибо за уроки!!
    в процессе просмотра возникли сл. вопросы:
    Почему Ваша студия не отражает ссылки на свойства, методы, классы?
    7:04 - не пользуетесь подсказками (чисто теоретически выскакивает помощник, который поможет реализовать интерфейс)
    пишите вручную юзинги.
    знак => отображается как ⇒
    Странная у вас студия)) почему так?

    • @PlatinumTechTalks
      @PlatinumTechTalks  2 ปีที่แล้ว +1

      Здравствуйте! Спасибо вам!
      Всё прописывалось вручную чтобы было понятно откуда что идет.в реальной жизни пользуемся подсказками конечно же.
      Стрелочка и прочее - это специально разработанный шрифт для чтения кода от компании JetBrains.скачать можно на их официальном сайте

  • @BraentR
    @BraentR 3 ปีที่แล้ว

    Спасибо

  • @BrostylesCat
    @BrostylesCat 2 ปีที่แล้ว +1

    вроде все повторила но нет using Notes.Domain , версия 6,0 Core

    • @BrostylesCat
      @BrostylesCat 2 ปีที่แล้ว +1

      капец, кликнула на и уже от туда добавила using ,а так небыло)) ну и ладно

    • @BrostylesCat
      @BrostylesCat 2 ปีที่แล้ว +1

      блиииин в интерфейсах тоже самое тока тут не подтягиваеться....

    • @BrostylesCat
      @BrostylesCat 2 ปีที่แล้ว +2

      вторая ошибка была в том что силку добавила не на Domein , а на NoteAplication)Можно смотреть дальше видио

  • @this_is_denys
    @this_is_denys 2 ปีที่แล้ว

    Насколько трудно будет сделать/переделать приложение под MySQL, а не SQLite, руководствуясь этим вашим плейлистом? Много кода менять придется?

    • @PlatinumTechTalks
      @PlatinumTechTalks  2 ปีที่แล้ว +2

      Вам нужно будет поменять строку подключения и провайдера в уровне Persistence. Остальное без изменений, в этом весь смысл независимости в чистой архитектуре от всего внешнего

  • @ak_nex
    @ak_nex 3 ปีที่แล้ว

    Что-то не пойму, зачем нужен INotesDbContext, если для тестов можно с таким же успехом подключить EF In-Memory, а то и вообще запустить в памяти Sqlite (с родным вендором код при тесте уж точно отработает именно так, как в реальности)?
    А моки дадут такой же результат, как и EF InMemory (хотя не, вызов SaveChanges() не отследить)

    • @PlatinumTechTalks
      @PlatinumTechTalks  3 ปีที่แล้ว +1

      INotesDbContext - это описание контракта, мы его можем использовать хоть по всему приложению (и позже это сделаем), а NotesDbContext - это конкретная реализация интерфейса INotesDbContext, которую в целом можно подменить на любую другую реализацию такого же интерфейса (например на DbContext с PostgreSQL) и все части приложения, использующие у себя INotesDbContext подхватят новую реализацию.
      Для тестов да, использование EF In-Memory очень правильный вариант. Мы используем наш DbContext, но в параметрах указывем In-Memory базу данных, тем самым абстрагируясь от той, которую используем в действительности.

    • @PlatinumTechTalks
      @PlatinumTechTalks  3 ปีที่แล้ว +2

      То есть основная идея тут следующая: интерфейс объявлен на уровне Application и будет использоваться в слое Сценарии (предыдущее видео про чистую архитектуру). Этот уровень оперирует абстракциями и не знает ничего про то как оно реализовано во внешнем мире. Проект Persistence - это уже внешний слой, содержащий реализацию

    • @ak_nex
      @ak_nex 3 ปีที่แล้ว +3

      @@PlatinumTechTalks Аа, это для инверсии зависимости, тогда понятно)
      Всё репозитории из головы не выйдут, вот и забыл про этот момент))
      Интересный подход, надо будет обдумать на досуге.
      Но, наверное, обращение к DbSet через Linq для условного MongoDb сложновато будет обернуть :(
      То есть с репозиториями архитектуру можно было бы сделать чище: стало бы возможным менять ORM или провайдеры баз, неподдерживаемых EF-ом.
      С другой стороны, если пренебрегнуть гибкостью в этом плане, то будет чище кодовая база: не будет репозиториев, а все обращения к коллекциям сущностей будут инкапсулированы в обработчиках команд/запросов, что, вероятно, мы и увидим в следующих выпусках :-). Правда в этом случае INotesDbContеxt служит лишь для красивой картинки зависимостей, которая не будет отражать реалии, т.к. EF в данном случае подменить не получится...
      Поэтому всё-таки встаёт вопрос: почему без репозиториев? Очень высока вероятность, что заметки захочется хранить в NoSql, а само приложение не выйдет настолько большим, чтобы репозитории распухли)
      Надеюсь, не слишком много тут пишу) Занимательная тема) хочется подискутировать и узнать опыт других)

    • @ak_nex
      @ak_nex 3 ปีที่แล้ว +1

      Кстати, для перехода на Postgresql и любой другой провайдер, поддерживаемый EF-ом, интерфейс INotesDbContext тоже мало чем поможет, ведь для этого будет достаточно подменить options в фабрике создания NotesDbContext в DI-контейнере.
      А вот будут ли после этого linq-запросы транслироваться в ожидаемый sql-запрос - это ещё вопрос...

    • @PlatinumTechTalks
      @PlatinumTechTalks  3 ปีที่แล้ว

      Репозторий - это абстракция. а EF сам и предоставляет эту абстракцию.
      Совершенно другой разговор, если вдруг команда решает что для проекта EF это кусок чего-то нехорошего и решает, что давайте даппер, например, использовать
      А так с точки зрения потребления кода нет разницы репозиторий или DbSet. DbSet - делает тоже самое.
      Что касается тестирования. Надо исходить из задач. Несмотря на то, что InMemory вариант неплохой, он не всегда может подойти (кстати, сам майкрософт не рекомендует использовать InMemory). У нас например возникала
      проблема с констрейнами. то есть, имеются проблемы тестирования схемы базы. Но для тестирования логики подходит. А если нужно тестировать с базой, то это уже вопрос о развертывании интеграционных тестов.
      Что касается NoSQL, то например Cosmos DB - это NoSQL база и EF Core её поддерживает. То есть о том как DbSet работает с NoSQL - это не наша забота, это ответственность провайдеров.
      INotesDbContex для перехода не нужен, достаточно заменить options, но новый DbContext будет реализовывать всё тот же интерфейс INotesDbContext, который мы используем в приложении.приложению неважно какой DbContext использовать потому что это уже уровень внешних деталей, а внутри мы оперируем абстракциями.

  • @LordAlanttt
    @LordAlanttt 3 ปีที่แล้ว +1

    database first кажется убрали кже

  • @3dmboy
    @3dmboy 2 ปีที่แล้ว +2

    Для новичка довольно сложное объяснение. К каждому предложению возникает много вопросов (

    • @PlatinumTechTalks
      @PlatinumTechTalks  2 ปีที่แล้ว

      спасибо за отклик, изначально не планировалось что это для новичка :) тут вообще каждая отдельная тема заслуживает отдельного курса... конечно всё не охватить в коротких видео

  • @nikolaifedorov685
    @nikolaifedorov685 ปีที่แล้ว +1

    FluentApi читается легче - аргументация от мамкиного архитектора. Какая гибкость? уже несколько лет сталкиваюсь вот с такими мамкинами архитекторами, которые предлагаю использовать FluentAPI. Это приводит к том, что ты не видишь настоящего названия столбца в таблице, не видишь наложенных констрейнтов. Тебе для этого приходится искать где находится файл с флюентом. Слава богу удалось в одном месте убедить уйти от FluentAPI.
    Легче читается это когда ты видишь мэппинг свойства на столбец и прочие атрибуты столбца.
    Зачем вы предлагаете открывать два файла, когда можно открыть один?

  • @dv3148
    @dv3148 ปีที่แล้ว

    th-cam.com/video/wkF3csnu2hE/w-d-xo.html
    Возможно, вызов base.OnModelCreating должен быть все-таки ДО вызова прочих методов от builder? В моем случае, вызов метода base.OnModelCreating, например, после вызова builder.ApplyConfigurationsFromAssembly, реконфигурирует типы entity по своему (т.е. по дефолту). Так, вызов метода base.OnModelCreating убивает мою настройку целевой таблицы ToTable, сделанной посредством ETC в указанной мною сборке.

  • @scc-6
    @scc-6 ปีที่แล้ว

    Кто из 2023го. Устанавливайте нагет 7й версии, мой ругается на 7й кор

  • @termineye111
    @termineye111 ปีที่แล้ว +1

    ужасная подача без визуализации и объяснения, а за одно с бешеным темпом

  • @ВладимирКрасный-о2б
    @ВладимирКрасный-о2б 2 ปีที่แล้ว

    всем привет! Можете подсказать в чем проблема?
    protected override void OnModelCreating(ModelBuilder builder)
    {
    builder.ApplyConfiguration(new NoteConfiguration());
    base.OnModelCreating(builder);
    }
    выдает ошибку: Severity Code Description Project File Line Suppression State
    Error CS0411 The type arguments for method 'ModelBuilder.ApplyConfiguration(IEntityTypeConfiguration)' cannot be inferred from the usage. Try specifying the type arguments explicitly. Notes.Presistence C:\Users\krasn\source
    epos\Notes.Backend\Notes.Presistence\NotesDbContext.cs 17 Active

  • @Максим-ы2э1ц
    @Максим-ы2э1ц ปีที่แล้ว +8

    А разве использование Класса Dbcontext в Domain не будет вводить нас в зависимость от фреймворка EF, на уровне Core? В схеме чистой архитектуры изображено что Уровень Core не должен зависеть от фреймворка.

    • @enfissione8297
      @enfissione8297 ปีที่แล้ว +2

      Вот тот же вопрос, зачем нашему Domain знать про EF вообще

    • @sergbo3114
      @sergbo3114 5 หลายเดือนก่อน

      Что-то я не понял а как вы собрались использовать DbContext в Domain? Использовать бд будет Application уровень и то через его-же собственный интерфейс INotesDbContext который не зависит от EF. А реализацию интерфейса представит DI.

  • @winstochurgle9133
    @winstochurgle9133 2 ปีที่แล้ว +1

    Когда нужно создавать первую миграцию?Как я понимаю, после создания уровня infrastructure? Добавив контекст в DI контейнер?

  • @Fikusiklol
    @Fikusiklol ปีที่แล้ว

    Какие преимущества такой "реализации" репозитория через DbSet?
    Учитывая, что дальше используется MediatR, то вся дополнительная логика (сортировка, фильтрация, пагинация, преобразования, и тд) будет:
    1) либо в Handler классах прямо в методе Handle
    2) либо в доп сервисе, который нужно будет создать, который и будет фактически служить аналогом репозитория.
    Это же нарушает солид напрямую, т.к всегда реализация будет прямо в местах, куда прокидывается интерфейс, где есть DbSet.

  • @СергейДовгалев-ц1щ
    @СергейДовгалев-ц1щ 11 หลายเดือนก่อน

    не совсем понял, зачем определяем метод SaveChanges если его в дальнейшем можно вызвать из DbContext. В чем преимущество такого подхода?

  • @IvanenkoStepan
    @IvanenkoStepan 3 ปีที่แล้ว +2

    Да благословит вас Аллах👍

  • @enfissione8297
    @enfissione8297 ปีที่แล้ว

    DbContext интерфейс должен быть в infrastructure, не в application слое

  • @Vladiliano
    @Vladiliano ปีที่แล้ว

    Ничего не понял, ну ладно на превьюшке написано "профессионально"

  • @krahmaletskrakmalets7587
    @krahmaletskrakmalets7587 2 ปีที่แล้ว +1

    Привет! Подскажите : Если сущностей несколько то как поступить? Делать на каждую сущность контекст или один класс контекста, в котором осуществляется управление всеми сущностями?

    • @maflend2762
      @maflend2762 2 ปีที่แล้ว +1

      Один контекст для всех сущностей которые хранятся в бд

    • @krahmaletskrakmalets7587
      @krahmaletskrakmalets7587 2 ปีที่แล้ว

      @@maflend2762 спасибо

    • @this_is_denys
      @this_is_denys 2 ปีที่แล้ว

      @@maflend2762 Интерфейс дб контекста тоже один на все сущности в базе, или интерфейсы отдельные под каждую сущность и потом реализация всех этих интерфейсов в одном классе дб контекста?

    • @this_is_denys
      @this_is_denys 2 ปีที่แล้ว

      @@maflend2762 И как быть с классами конфигурации и сущностей? Классы сущностей лучше хранить по разным файлам, но в одной папке в проекте .Domain или вообще все в одном файле? И класс конфигурации один на все сущности или для каждой сущности свой и так же в отдельном файле, но в одной папке?

    • @sergeyomel
      @sergeyomel ปีที่แล้ว

      @@this_is_denys Нашли ответ на ваш вопрос? Столкнулся с таким же

  • @antya1126
    @antya1126 4 หลายเดือนก่อน

    Преогромное спасибо

  • @martahnat1146
    @martahnat1146 2 ปีที่แล้ว +1

    Привіт, а у visual code немає Microsoft Entity Framework Core.Sqlitе, що можна використати замість цього?)

    • @PlatinumTechTalks
      @PlatinumTechTalks  2 ปีที่แล้ว +1

      спробуйте через .NET CLI:
      dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 5.0.11