Как перейти от свойства навигации EF Core к ответу JSON вложенного Web API? - PullRequest
0 голосов
/ 12 мая 2018

Я пытался следовать некоторым основным учебным пособиям по .Net, я хочу создать веб-API Asp.net Core, использующий EF Core.

В основном .Include (), похоже, ничего не делает, и я даже не думал, что сначала это будет необходимый вызов, если честно.

У меня есть API с Goldfish, которыйЕсли у вас есть идеи, JSON возвращается для отдельных объектов, за исключением того, что мое свойство навигации всегда имеет значение NULL для золотой рыбки:

[
{
    "id": 1,
    "name": "Bob",
    "isAlive": true,
    "food": 50,
    "ideas": null
},..

Вот класс Goldfish (он также не работает для ICollection)

 public class Goldfish
{
    public long ID { get; set; }
    public string Name { get; set; }
    public bool IsAlive { get; set; }
    public long Food { get; set; }

    public IEnumerable<Idea> Ideas { get; set; }
}

А вот класс Idea (я использую атрибут Foreignkey из отчаяния, чтобы заставить его работать, ранее у меня было свойство GoldfishID.

    public class Idea
{
    public long ID { get; set; }
    public string Title { get; set; }
    public string Gist { get; set; }
    public long GoldfishID { get; set; }

    [ForeignKey("GoldfishID")]
    public Goldfish Goldfish { get; set; }

}

Я думаю, что моя база данных в порядке,поскольку внешний ключ был настроен в моей таблице идей:

ALTER TABLE [dbo].[Ideas]  WITH CHECK ADD  CONSTRAINT 
[FK_Ideas_Goldfish_GoldfishID] FOREIGN KEY([GoldfishID])
REFERENCES [dbo].[Goldfish] ([ID])
ON DELETE CASCADE
GO

Но когда я получаю доступ к своему методу контроллера:

        [HttpGet]
    public IEnumerable<Goldfish> GetAll()
    {
        var stuff = _context.Goldfish.Include(i => i.Ideas);

        return stuff.ToList();
       // return _context.Goldfish.ToList();
    }

Благодаря моему любимому инструменту во всем мире, я знаю,SQL, который работает, не имеет ни объединения, ни каких-либо попыток получить идеи - моя золотая рыбка забита мозгом: (

    SELECT [g].[ID], [g].[Food], [g].[IsAlive], [g].[Name]
FROM [Goldfish] AS [g]

Пожалуйста, дайте мне знать, где я ошибаюсь ... это мой тип возврата, исключая типструктурыя хочу?Я скажу, что я не настроил желаемое «один ко многим» явно в OnModelCreating, поскольку учебник этого не сделал, вот весь мой контекст:

    public class GoldfishContext : DbContext
{
    public GoldfishContext(DbContextOptions<GoldfishContext> options)
        : base(options)
    {
    }

    public DbSet<Goldfish> Goldfish { get; set; }
    public DbSet<Idea> Ideas { get; set; }

    //Interrupt the standard configuration of table names, the tutorial has this and it's nice to keep ffr
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Goldfish>().ToTable("Goldfish");


    }
}

Я должен упомянуть!Я добавил эти идеи в мою DBInitialise, и они определенно существуют в БД:

            var pondideas = new Idea[]
        {
            new Idea {Title="Bobs idea", Gist = "Give bob food", GoldfishID=1},
            new Idea {Title="Bobs second idea", Gist = "Give bob more food", GoldfishID=1},
            new Idea {Title="Nice idea", Gist = "Feed everyone", GoldfishID=1},
            new Idea {Title="terrible idea", Gist = "Feed nobody", GoldfishID=1}
        };

1 Ответ

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

Указанный в правильном направлении (спасибо Shyju), я хочу выразить решение в ясных терминах:

Правильный пакет для .Include () - Microsoft.EntityFrameworkCore

Длякоторый вам нужно добавить: используя Microsoft.EntityFrameworkCore;

Код будет работать с неверной версией (.Net framework), но include ничего не сделает.

Как только выдобавьте нужную библиотеку, и если ваши модели будут связаны, как моя, ваш API будет иметь тайм-аут, если вы не добавите следующие JsonOptions в свой запуск для предотвращения хаоса циклических ссылок:

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