Реализация связей между таблицами

Редактировал(а) Alexandr Fokin 2023/06/30 12:03

Реализация связей
 
Тип связиEntityFrameworkCoreEntityFramework
One to oneОтношение один к одному
https://metanit.com/sharp/entityframeworkcore/3.4.php

Связь один-к-одному
https://metanit.com/sharp/entityframework/3.6.php

One to manyОтношение один ко многим
https://metanit.com/sharp/entityframeworkcore/3.5.php
Связь один ко многим
https://metanit.com/sharp/entityframework/3.7.php
Many to manyОтношение многие ко многим
https://metanit.com/sharp/entityframeworkcore/3.6.php
Связь многие ко многим
https://metanit.com/sharp/entityframework/3.8.php
 
Реализация загрузки связанных сущностей
 
НаименованиеОписаниеEntityFrameworkCoreEntityFramework
Eager loading
Жадная загрузка
Загрузка связанных данных выполняется сразу же.
Необходимо явно указать навигационные свойства.
Загрузка связанных данных. Метод Include
https://metanit.com/sharp/entityframeworkcore/3.3.php
Навигационные свойства и загрузка данных
https://metanit.com/sharp/entityframework/3.2.php
Explicit loading
Явная загрузка
Механизм позволяет явно подгружать связанные данные, для уже загруженного объекта.
Lazy loading
Ленивая загрузка

Загрузка выполняется при первом обращении к навигационному свойству из кода.
Наименее эффективный метод, но не требует меньше усилий при продумывании.

 
 ICollection dictionary wrapper
HasForeignKeyДля связи указывает поле внешнего ключа в зависимой сущности.
HasPrincipalKeyДля связи позволяет указать ключевое поле (Primary or alter key) в сущности, на которую ссылается зависимая сущность.
(Если не задано, то подразумевается первичный ключ).
 

Комплексные типы

Owned Entity Types
https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities

Комплексные типы
https://metanit.com/sharp/efcore/3.7.php

Domain Driven Design: Value Objects и Entity Framework Core на практике
https://habr.com/ru/post/443770/

modelBuilder.Entity<Entity1>(
(b) =>
{
    b.HasKey(e => e.Id);

    b.OwnsOne(
        e => e.CreateDate,
        b2 =>
        {
         //Setup ownded type

         //Необязательно - явно определить свойство и ключ владельца
         builder.WithOwner(nameof(Owner))
                .HasForeignKey(e => e.OwnerId);
        }
        );
}
);

В качестве подчиненного типа может выступать Record класс.
Для типизированной реализации доступа к владельцу можно использовать OwnedClass<TOwner, TOwnerKey>


Теги: