EF Core NullReferenceException для связанного свойства навигации - PullRequest
0 голосов
/ 24 марта 2020

У меня есть две родственные модели.

    public class Offer
    {
        public long Id { get; set; }
        public string OfferCode { get; set; }
        public string Description { get; set; }

        // more properties

        public int ProductId { get; set; }
        public virtual Product Product { get; set; }
    }

    public class Product
    {
        public long Id { get; set; }
        public string Name { get; set; }

        // more properties

        public virtual ICollection<Offer> Offers { get; set; }
    }

Я пытаюсь создать форму MVC с элементом select HTML, в котором Предложения группируются, а продукты и Имена продуктов служат оптгруппами. С этой целью у меня есть модель представления, которую я намереваюсь заполнить сгруппированными предложениями, и у меня есть способ сделать это.

        private OfferMessageViewModel PrepareViewModel(OfferMessageViewModel viewModel)
        {
            var offers = _context.Offers.Include(o => o.Product).ToList()
                .GroupBy(o => o.Product.Name).ToList();

            foreach (var offerGroup in offers)
            {
                var optionGroup = new SelectListGroup
                {
                    Name = offerGroup.Key
                };

                foreach (var offer in offerGroup)
                {
                    viewModel.Offers.Add(
                        new SelectListItem
                        {
                            Value = offer.OfferCode,
                            Text = offer.Description,
                            Group = optionGroup
                        }
                    );
                }
            }
            return viewModel;
        }

Код срабатывает в предложении GroupBy. o.Product равно нулю, даже если o.ProductID содержит значение.

Вызов ToList() прямо перед GroupBy не помогает.

Я пытался удалить virtual модификаторы в свойствах навигации связанных объектов, но ошибка не исчезла.

Установка пакета NuGet Microsoft.EntityFrameworkCore.Proxies и его изменение и настройка

services.AddDbContext<ApplicationDbContext>(options =>
                options.UseLazyLoadingProxies() 
                .UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

также не вызывали ошибку go прочь.

Есть что-то еще, что я пропускаю?

Любая помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ: Было предложено, что мой пост может быть решена этим ТАК вопрос . Но я получаю исключение нулевой ссылки даже при явно включенной отложенной загрузке. Я попробовал предложенные решения там, но все еще не повезло.

1 Ответ

1 голос
/ 24 марта 2020

Я в конце концов решил это.

Очевидно, проблема заключалась в том, что внешний ключ был int, ссылающийся на первичный ключ типа long.

Поэтому я изменил

* От 1008 *

до

public long ProductId { get; set; }

в модели Offer. Добавлена ​​необходимая миграция, обновлена ​​база данных и теперь она работает. Больше нет исключений нулевой ссылки.

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

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