Нулевые дочерние подкатегории или определение БД - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь разработать очень простой веб-API ASP.net core 2.0. Он содержит два модельных класса: категории и подкатегории. Тем не менее, когда я вызываю CategoriesController как:

http://localhost:51242/api/categories

... все дети Подкатегории нулевые.

[  
   {  
      "id":1,
      "en":"Sports",
      "de":"Sports",
      "fr":"Sports",
      "it":"Sport",
      "es":"Deportes",
      "shown":0,
      "subcategories":null,
      "subscribers":0
   },
   {  
      "id":2,
      "en":"Computers",
      "de":"Computers",
      "fr":"Computers",
      "it":"Computers",
      "es":"Computadoras",
      "shown":0,
      "subcategories":null,
      "subscribers":0
   }
]

Когда я заполняю базу данных (UseInMemoryDatabase), я вижу, что категории DbSet содержат все подкатегории, присутствующие в файле json, используемом для заполнения (см. Изображение). Так что я не уверен, что это происходит? Я что-то пропустил?

Screenshot after seeding the DB

Я новичок в ядре ASP.net, это мое первое приложение :-)

[Produces("application/json")]
[Route("api/Categories")]
public class CategoriesController : Controller
{
    private readonly NetAdContext _context;

    public CategoriesController(NetAdContext context)
    {
        _context = context;
    }

    // GET: api/Categories
    [HttpGet]
    public IEnumerable<Category> GetCategories()
    {
        return _context.Categories;
    }
}

public class Category
{
    public long Id { get; set; }
    public string En { get; set; }
    public string De { get; set; }
    public string Fr { get; set; }
    public string It { get; set; }
    public string Es { get; set; }
    public long Shown { get; set; }
    public List<Subcategory> Subcategories { get; set; }
}

public class Subcategory
{
    public long Id { get; set; }
    public string En { get; set; }
    public string De { get; set; }
    public string Fr { get; set; }
    public string It { get; set; }
    public string Es { get; set; }
    public long Shown { get; set; }
    public long Subscribers { get; set; }
    public long CategoryId { get; set; }
    public long LocationId { get; set; }
}

NetAdSeed вызывается из Program.cs

static public class NetAdSeed
{
    public static void Initialize(NetAdContext context)
    {
        context.Database.EnsureCreated();

        // Seed categories and subcategories
        if (context.Categories.Count() == 0)
        {
            // Load list of categories and subcategories from file to string
            string json = System.IO.File.ReadAllText(@".\json\categories.json");

            // Deserialize
            List<Category> cats = JsonConvert.DeserializeObject<List<Category>>(json);

            context.Categories.AddRange(cats);
            context.SaveChanges();
        }
    }
}

public class NetAdContext : DbContext
{
    public DbSet<Category> Categories { get; set; }

    public DbSet<Subcategory> Subcategory { get; set; }

    public NetAdContext(DbContextOptions<NetAdContext> options)
        : base(options)
    {
    }
}

1 Ответ

0 голосов
/ 10 мая 2018

Этот фрагмент кода имеет много проблем:

// GET: api/Categories
[HttpGet]
public IEnumerable<Category> GetCategories()
{
    return _context.Categories;
}
  • Запросы к базе данных должны быть асинхронными, особенно с Entity Framework Core, который поддерживает это "из коробки".
  • Вы должны всегда возвращать IActionResult в ASP.NET Core, чтобы вы могли возвращать разные результаты и сохранять их независимость от результата
  • Вы не должны возвращать объекты напрямую, вместо этого следует использовать объекты передачи данных. Это позволяет изменить то, что вы возвращаете в соответствии с клиентом

Итак, это должно выглядеть примерно так:

public class CategoryDto // or some other better name
{
    public string Name { get; set; }
    // Choose the MINIMUM amount of properties that the client needs
}

// GET: api/Categories
[HttpGet]
public async Task<IActionResult> GetCategories()
{
    var categories = await _context.Categories
        .Include(x => x.SubCategories) // this line you are missing
        .ToListAsync();

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