ASPNET Core - ответ Json останавливается на связанной модели - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть два класса, которые имеют отношения между ними.Это классы Market и Promotion.Я сталкиваюсь с проблемой, когда делаю запрос.Результат json останавливается, когда дело касается отношения.

Класс Market:

    public class Market : BaseModel
    {
        [Required]
        public string Name { get; set; }
        [Required]
        public string Address { get; set; }

        // GPS informations.
        public double Latitude { get; set; }
        public double Longitude { get; set; }

        [Required]
        public Guid PictureId { get; set; }
        public Picture Picture { get; set; }

        public List<Promotion> Promotions { get; set; }
    }

Класс продвижения:

        public class Promotion : BaseModel
    {
        [Required]
        public string Description { get; set; }
        [Required]
        public double Price { get; set; }

        [Required]
        public Guid PictureId { get; set; }
        public Picture Picture { get; set; }

        [Required]
        public Guid MarketId { get; set; }
        public Market Market { get; set; }
    }

Когда я делаю следующий запрос,Я получил неполный ответ.

        [HttpGet]
        [AllowAnonymous]
        public async Task<ActionResult<IEnumerable<Market>>> Get()
        {
            var markets = await _context.Markets
                .Include(m => m.Owner)
                .Include(m => m.Picture)
                .Include(m => m.Promotions)
                .ToListAsync();

            return markets;
        }

Ответ json прекращается, когда он попадает в MarketId первой акции.

    ...
        "pictureType": 0,
        "pictureUrl": "https://superbarato.azurewebsites.net/api/Pictures/url/d6bc07a8-db55-4ee5-7342-08d73f6147e9",
        "id": "d6bc07a8-db55-4ee5-7342-08d73f6147e9",
        "createdAt": "2019-09-22T13:34:26.9367403",
        "updatedAt": "0001-01-01T00:00:00",
        "deletedAt": "0001-01-01T00:00:00",
        "ownerId": "75c1f286-c07f-4e50-dda0-08d73f61058f",
        "owner": null
    },
    "promotions": [
        {
            "description": "Açúcar Camil 1Kg",
            "price": 5.0,
            "pictureId": "e7af68b9-c053-4f4b-7344-08d73f6147e9",
            "picture": null,
            "marketId": "e2962be8-1a19-418a-6ce7-08d73f62308d"

Как получить все акции?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

В EF Core вы можете настроить Json.NET на игнорирование циклов, которые он находит в графе объектов.Это делается с помощью метода ConfigureServices(...) в Startup.cs.

services.AddMvc()
    .AddJsonOptions(
        options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );

. Другой альтернативой является присвоение одному из свойств навигации атрибута [JsonIgnore], который инструктирует Json.NET не проходить эту навигацию.свойство при сериализации.

Ссылка: https://docs.microsoft.com/en-us/ef/core/querying/related-data#related-data-and-serialization

0 голосов
/ 23 сентября 2019

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

[HttpGet]
[AllowAnonymous]
public async Task<ActionResult<IEnumerable<MarketModel>>> Get()
{
    var markets = await _context.Markets
        .Select(m => new MarketModel {
            Name = m.Name,
            // Other properties needed to be serialized to response body
            Promotions = m.Promotions.Select(p => new PromotionModel {
                Description = p.Description,
                // Other properties needed to be serialized to response body
                MarketId = p.Market.Id
            }
        }
        .ToListAsync();

    return markets;
}

public class MarketModel
{
    public string Name { get; set; }

    // Other properties needed to be serialized to response body

    public List<PromotionModel> Promotions { get; set; }
}

public class PromotionModel
{
    public string Description { get; set; }

    // Other properties needed to be serialized to response body

    public Guid MarketId { get; set; }
}

Надеюсь, это поможет.

...