EF Codefirst GET Метод Подмодели не приходят - PullRequest
0 голосов
/ 17 мая 2019

EF Codefirst Метод GET Подмодели не поступают. С Database First Я хочу следующий результат Json. Тем не менее, я не могу получить следующий Json с Code First . Мне нужна структура для работы с модельными отношениями без запуска метода include.

Model.cs

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

            public virtual DbSet<Blog> Blogs { get; set; }
            public virtual DbSet<Post> Posts { get; set; }
        }

        public class Blog
        {
            public int BlogId { get; set; }
            public string Url { get; set; }

            public ICollection<Post> Posts { get; set; }
        }

        public class Post
        {
            public int PostId { get; set; }
            public string Title { get; set; }
            public string Content { get; set; }

            public int BlogId { get; set; }
            public Blog Blog { get; set; }
        }

ValuesController.cs

        private readonly BloggingContext db;

        public ValuesController(BloggingContext db)
        {
            this.db = db;
        }

        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<Blog>> Get()
        {
            return db.Blogs.ToList();
        }

Startup.cs

var connection = @"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.AspNetCore.NewDb;Trusted_Connection=True;ConnectRetryCount=0";
            services.AddDbContext<Models.Model.BloggingContext>
                (options => options.UseSqlServer(connection));

Таблицы базы данных

Blogs Table Result
__________________
BlogId  |   Url
1       |   asdasd1
2       |   asdas2

Posts Table Result
__________
PostId  |   Title   |   Content |   BlogId
1       |   asdasd  |   fdg     |   1
2       |   fsg     |   asda    |   1
3       |   dsgfsdg |   sgf     |   2

Результат выполнения

[
  {
    "blogId": 1,
    "url": "asdasd1",
    "posts": null
  },
  {
    "blogId": 2,
    "url": "asdas2",
    "posts": null
  },
  {
    "blogId": 3,
    "url": "asdsad3",
    "posts": null
  }
]

Я хочу работать с вышеуказанными кодами

[
  {
    "blogId": 1,
    "url": "asdasd1",
    "posts": [
      {
        "PostId": 1,
        "Title": "asdasd",
        "Content": "fdg"
      },
      {
        "PostId": 2,
        "Title": "fsg",
        "Content": "asda"
      }
    ]
  },
  {
    "blogId": 2,
    "url": "asdas2",
    "posts": {
      "PostId": 2,
      "Title": "fsg",
      "Content": "asda"
    }
  },
  {
    "blogId": 3,
    "url": "asdsad3",
    "posts": null
  }
]

1 Ответ

0 голосов
/ 17 мая 2019

EF не загружает отношения автоматически по умолчанию, так как для этого потребуются соединения SQL, что нежелательно в большинстве сценариев - только если вы на самом деле хотели получить связанные данные.

В результате у вас есть два варианта: быстро загружать отношения, используя Include, или полагаться на отложенную загрузку, чтобы запрашивать связанные данные, как раз вовремя, когда к ним обращаются. Ленивая загрузка не включена по умолчанию, потому что, честно говоря, это немного против паттерна, и вы не должны использовать его, если вы хорошо осведомлены о последствиях и возможных проблемах.

В этом конкретном сценарии эти возможные проблемы могут быстро и драматично поднять их уродливые головы. Так как вы сериализуете сущность, сериализатор будет касаться каждого отношения, вызывая индивидуальный запрос, чтобы получить этот конкретный набор связанных данных. Это будет происходить также для каждого блога, который вы просматриваете. И если бы у какого-либо из связанных предметов были связанные вещи сами, вы бы выдавали экспоненциальное количество дополнительных запросов. Короче говоря, ленивая загрузка чего-то подобного может привести к сотням, если не тысячам или более запросов, выдаваемых одновременно - не то, что вы хотите, чтобы происходило, мягко говоря.

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

В качестве альтернативы, вы можете рассмотреть возможность использования чего-то вроде OData или GraphQL. Это само по себе не решает проблему: по умолчанию связанные элементы не будут включены. Тем не менее, оба из них предоставляют возможность запрашивать связанные данные как часть запроса, позволяя клиенту извлекать только те отношения, которые ему нужны или в которых они заинтересованы. Это решает вашу проблему нежелания указывать и запрашивать каждую отдельную связь одновременно. , в то же время предоставляя клиенту простой способ получить его, если ему это нужно / нужно.

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