Как не показывать идентификатор внешнего ключа в возвращенном JSON? - PullRequest
0 голосов
/ 20 января 2020

Я использую. NET Проект веб-API Core 3.0. При настройке отношений у меня есть свойство модели с именем ProductTypeID, которое является внешним ключом, содержащим идентификатор таблицы ProductType. Когда я запрашиваю UnitOfWork и возвращаю этот результат в контроллер, я sh удаляю productTypeID из JSON.

ProductsController:

[HttpGet]
public IEnumerable<Product> Index()
{
    var products = _service.GetAll();

    return products;
}

Репозиторий ( где он в конечном итоге возвращает данные, обратно в сервис, затем обратно в контроллер):

public override IEnumerable<Product> GetAll()
{
    return _context.products
        .Include(x => x.ProductType)
        .AsEnumerable();
}

ProductSeeder:

_modelBuilder.Entity<ProductType>().HasData(new ProductType
{
    ID = 1,
    Name = "Pizza"
});

_modelBuilder.Entity<Product>(x =>
{
    x.HasOne(d => d.ProductType)
    .WithMany()
    .HasForeignKey(p => p.ProductTypeID);
});

_modelBuilder.Entity<Product>().HasData(
    new Product { 
        ProductTypeID = 1,
        ID = 1,
        Name = "Pepperoni",
        Price = 12m,
        Description = "Test Description"
    },
    new Product
    {
        ProductTypeID = 1,
        ID = 2,
        Name = "Margherita",
        Price = 10m,
        Description = "This is a margherita pizza"
    }
);

Модель продукта:

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

    [Required]
    [Column(TypeName = "decimal(18,2)")]
    public decimal Price { get; set; }

    [Required]
    public string Description { get; set; }

    public int ProductTypeID { get; set; }


    public virtual ProductType ProductType { get; set; }
}

Возвращено JSON в браузере:

[
  {
    "name": "Pepperoni",
    "price": 12,
    "description": "Test Description",
    "productTypeID": 1,
    "productType": {
      "name": "Pizza",
      "id": 1,
      "createdAt": "20/01/2020 19:28:26",
      "updatedAt": "20/01/2020 19:28:26"
    },
    "id": 1,
    "createdAt": "20/01/2020 19:28:26",
    "updatedAt": "20/01/2020 19:28:26"
  },
  {
    "name": "Margherita",
    "price": 10,
    "description": "This is a margherita pizza",
    "productTypeID": 1,
    "productType": {
      "name": "Pizza",
      "id": 1,
      "createdAt": "20/01/2020 19:28:26",
      "updatedAt": "20/01/2020 19:28:26"
    },
    "id": 2,
    "createdAt": "20/01/2020 19:28:26",
    "updatedAt": "20/01/2020 19:28:26"
  }
]

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

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Я продолжил идею создания модели представления для каждого объекта базы данных. Это просто лучший подход. Затем я использую AutoMapper для сопоставления свойств с моделью представления. Спасибо всем, кто прокомментировал.

0 голосов
/ 21 января 2020

Вы можете добавить свойство JsonIgnore, чтобы удалить productTypeID из JSON:

public class Product:BaseModel
{
    [Required]
    public string Name { get; set; }
    [Required]
    [Column(TypeName = "decimal(18,2)")]
    public decimal Price { get; set; }
    [Required]
    public string Description { get; set; }

    [JsonIgnore]
    public int ProductTypeID { get; set; }

    public virtual ProductType ProductType { get; set; }
}
...