Навигационные свойства EF Core загружаются сами - PullRequest
1 голос
/ 25 апреля 2020

У меня есть следующие классы как сущности в моем DB_Context.

public class Glossary
{
    #region Properties
    public Guid GlossaryId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }


    #region NavigationProperties
    public virtual ICollection<Item> Items { get; set; }
    #endregion
}
public class Item
{
    #region Properties
    public Guid ItemId { get; set; }
    public string Name { get; set; }
    public string Definition { get; set; }

    #region ForeignKeys
    public Guid GlossaryId { get; set; }
    #endregion
    #endregion

    #region Navigation Properties
    public virtual Glossary Glossary { get; set; }
    #endregion
}

Когда я пытаюсь включить Предметы сущности типа Глоссарий , используя

public async Task<IEnumerable<Glossary>> Get()
    {
        return await _context.Glossaries
                    .Include(x => x.Items)
                    .OrderBy(x => x.CreatedAt)
                    .ToListAsync();
    }

Я получаю следующее JSOn от моего API:

{
    "glossaryId": "674c1358-861b-11ea-9370-e45a1762a61b",
    "name": "Test1",
    "description": "Description of Test1",
    "items": [
        {
            "itemId": "f2847601-86db-11ea-9370-e45a1762a61b",
            "name": "TestItem",
            "definition": "TestDefinition",
            "glossaryId": "674c1358-861b-11ea-9370-e45a1762a61b",
            "glossary": {
                "glossaryId": "674c1358-861b-11ea-9370-e45a1762a61b",
                "name": "Test1",
                "description": "Description of Test1",
                "items": []
            }
        }
    ]
}

Моя проблема в том, что пункт Глоссария также включает в себя свой Глоссарий, который я не хочу .

Можно ли включить только одно свойство навигации, не добавляя его снова?

1 Ответ

1 голос
/ 26 апреля 2020

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

В вашей ситуации я бы представил Automapper. После установки Automapper на ваш проект Net .Core, я бы создал 2 DTO с именем:

public class GlossaryDto : ICustomMapping

    public Guid GlossaryId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }      

    public ICollection<ItemDto> Items { get; set; }

    public void CreateMappings(Profile configuration)
    {
        configuration.CreateMap<Glossary, GlossaryDto>();
    }

public class ItemDto  : ICustomMapping
{
    public Guid ItemId { get; set; }
    public string Name { get; set; }
    public string Definition { get; set; }

    public Guid GlossaryId { get; set; }

    public void CreateMappings(Profile configuration)
    {
        configuration.CreateMap<Item, ItemDto>();
    }

}

Теперь вы можете просто переписать свой Get, чтобы вернуть Dto вместо модель базы данных (сущность):

public async Task<IEnumerable<GlossaryDto>> Get()
    {
        var result = await _context.Glossaries
                    .Include(x => x.Items)
                    .OrderBy(x => x.CreatedAt)
                    .ToListAsync()
        return await mapper.Map<IEnumerable<GlossaryDto>(result);
    }

Таким образом, мы удалили циклическую ссылку из Dto, и у вас не возникло бы никаких проблем: поскольку ItemDto не имеет свойства "navigation" для GlossaryD, цепочка была правильно закрыто. Ваш JSON обладает всей необходимой информацией. В будущем, если вам нужно вернуть и ItemDto со свойством навигации GlossaryDto, создайте новое с другим именем. Вы также можете создать DTO, равный Model базы данных, а затем «вырезать» циклические ссылки с помощью автоматического преобразователя, указав MaxDepth () , но я предпочитаю создавать конкретные c DTO для того, что действительно необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...