EFCore - Как исключить принадлежащие объекты из автоматической загрузки? - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь обернуть голову вокруг объектов, принадлежащих EF Cores, и узнать, как я могу контролировать, когда загружать определенные куски данных.

В основном у меня есть куча старых унаследованных таблиц (некоторые с ~ 150 столбцами), и я хочу смоделировать их, используя корневую сущность и несколько принадлежащих ей объектов на таблицу, чтобы добиться лучшей сегментации и связать определенные функции. Пример: существует сущность «article», содержащая ~ 20 свойств для наиболее важных полей базовой таблицы. Эта сущность также содержит OwnedObject «StorageDetails», обертывающий еще десяток полей (и все функции, связанные с хранением вещей).

Проблема: я не могу найти способ контролировать, должен ли принадлежащий объект загружаться немедленно или нет. Для некоторых из них я бы предпочел загружать их явно, используя Include () ...

public class Article : EntityBase
{  
    public string ArticleNumber { get;set; }

    // Owned object, shares article number as key.
    public StorageDetails StorageStuff { get; set; }

    // An Entity from another table having a foreign key reference 
    public SomeOtherEntity OtherStuff { get; set; }
}

public class StorageDetails : OwnedObject<Article>
{
    public Article Owner { get; set; }
}

// Somewhere during model creation ...
builder.OwnsOne(article => article.StorageStuff);

builder.HasOne(article => article.OtherStuff ) 
       ...

Определение модели с OwnsOne и загрузка статьи немедленно загружает StorageStuff. Чтобы загрузить OtherThing, я должен включить его в запрос (Inlcude ()), чего я и хочу достичь для принадлежащего объекта.

Это возможно? Если нет, на какой другой подход вы могли бы указать мне?

1 Ответ

0 голосов
/ 04 января 2019

С собственными типами - это невозможно (в настоящее время), потому что это поведение "по замыслу". И задокументировано в Запросе собственных типов раздела документации EF Core:

При запросе владельца по умолчанию будут включены принадлежащие ему типы. Нет необходимости использовать метод Include, даже если принадлежащие типы хранятся в отдельной таблице.

Говорить «по умолчанию» немного расплывчато, но вы можете смело читать его как «всегда», потому что нет опции или метода Exclude.


Поскольку в настоящее время единственным способом управления загрузкой связанных данных является свойство навигации в real сущности, сделайте типы, которыми вы хотите управлять, «реальными сущностями», т.е. не помечайте их как принадлежащие, определите явный или теневой PK, и сопоставьте эти "сущности" с Table Splitting :

Теперь возможно отобразить два или более типов сущностей в одну и ту же таблицу, где столбцы первичного ключа будут совместно использоваться, и каждая строка будет соответствовать двум или более сущностям.

Чтобы использовать разбиение таблицы, необходимо настроить идентифицирующую связь (где свойства внешнего ключа образуют первичный ключ) между всеми типами сущностей, совместно использующими таблицу:

...