Как включить свойства навигации в EF Core

Я использую EF Core 5.0.1. У меня следующая модель. Я хочу получить свойство навигации после вставки данных, но всегда возвращаю значение null. Если я вызываю функцию GetStockItemAsync, она возвращается со значениями навигации.

Я попытался после успешной вставки вызвать GetStockItemAsync в методе AddStockItemAsync, который также возвращает null для навигации.

Я включил ленивую загрузку прокси в своем основном проекте asp.net.

public class StockType : MyDbObject
    {
        public StockType()
        {
            StockItems = new HashSet<StockItem>();
        }

        public int Id { get; set; }
        public string Type { get; set; }
        public string Description { get; set; }

        public virtual ICollection<StockItem> StockItems { get; set; }
    }
public class StockItem : MyDbObject
{
    public long Id { get; set; }
    public int TypeId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual StockType Type { get; set; }
}
public interface IMyDbContext
{
        DbSet<StockType> StockTypes { get; set; }
        DbSet<StockItem> StockItems { get; set; }
        Task<TEntity> InsertAsync<TEntity>(TEntity entity, CancellationToken cancellationToken = default) where TEntity : MyDbObject;
        void Create<TEntity>(TEntity entity) where TEntity : MyDbObject;
        Task<TEntity> GetFirstOrDefaultAsync<TEntity>(Expression<Func<TEntity, bool>> expression, CancellationToken cancellationToken = default) where TEntity : MyDbObject;
        Task CommitAsync(CancellationToken cancellationToken = default);
}

public class MyDbContext : IdentityDbContext<User, Role, Guid>, IMyDbContext
{
        public MyDbContext (DbContextOptions<MyDbContext> options) : base(options)
        { }
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            //required mapping configuration added//
        }

        public DbSet<StockType> StockTypes { get; set; }
        public DbSet<StockItem> StockItems { get; set; }
        public async Task<TEntity> InsertAsync<TEntity>(TEntity entity, CancellationToken cancellationToken = default) where TEntity : MyDbObject
        {
            var savedEntity = await Set<TEntity>().AddAsync(entity, cancellationToken);
            return savedEntity.Entity;
        }
        public void Create<TEntity>(TEntity entity) where TEntity : MyDbObject
        {
            Set<TEntity>().Add(entity);
        }

        public async Task<TEntity> GetFirstOrDefaultAsync<TEntity>(Expression<Func<TEntity, bool>> expression, CancellationToken cancellationToken = default) where TEntity : MyDbObject
        {
            return await Set<TEntity>().Where(expression).FirstOrDefaultAsync(cancellationToken);
        }
        public async Task CommitAsync(CancellationToken cancellationToken = default)
        {
            await SaveChangesAsync(cancellationToken);
        }
}

public interface IStockItemServices
    {
        Task<StockItem> GetStockItemAsync(Expression<Func<StockItem, bool>> expression);
        Task AddStockItemAsync(StockItem stockItem);
    }
public class StockItemServices : IStockItemServices
    {
        private readonly IMyRestaurantContext _context;
        public StockItemServices(IMyDbContext context)
        {
            _context = context;
        }

        public async Task AddStockItemAsync(StockItem stockItem)
        {
            _context.Create(stockItem);
            await _context.CommitAsync();
        }
        
        public async Task<StockItem> GetStockItemAsync(Expression<Func<StockItem, bool>> expression) => await _context.GetFirstOrDefaultAsync(expression);
    }

Настройки Startup.cs:

services.AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(configuration.GetConnectionString("DbConnectionString"));
                options.UseLazyLoadingProxies(true);
            });

person Mathavan    schedule 07.01.2021    source источник
comment
Вы должны настроить отношения в OnModelCreating с помощью FluentAPI. Подробнее здесь   -  person Ergis    schedule 07.01.2021
comment
После DbSet.AddAsync необходимо вызвать DbContext.SaveChanges.   -  person vernou    schedule 07.01.2021
comment
Используйте методы синхронного контекста для добавления/обновления/удаления, если вам нужна асинхронная версия. Используйте асинхронный метод для сохранения изменений, чтобы не блокировать вызывающий поток. AddAsync(). Этот метод является асинхронным только для того, чтобы разрешить генераторам специальных значений, таким как тот, который используется ValueGenerationStrategy для асинхронного доступа к базе данных. Во всех остальных случаях следует использовать неасинхронный метод. ~ Основные документы EF   -  person Prolog    schedule 10.01.2021
comment
Прочитайте эту статью о загрузке связанных данных в EF Core. И, как уже упоминал @Ergis, я не вижу кода конфигурации отношения для StockItem ==> StockType. Если вы не понимаете, о чем я говорю, прочтите этот статья о настройке отношений в EF Core.   -  person Prolog    schedule 10.01.2021
comment
@Prolog Это мое сопоставление gist.github.com/MathavanN/dec1abee181db7a34749890d4a82ff40   -  person Mathavan    schedule 12.01.2021
comment
@Prolog У меня возникла эта проблема, когда я вставляю новые данные. после успешного сохранения изменений (), свойства навигации показывают нуль. Но когда я пытаюсь получить этот элемент с помощью другого метода получения, отображаются все свойства навигации. Я обновил, чтобы использовать методы синхронного контекста для добавления. Тем не менее, свойство навигации отсутствует после вставки.   -  person Mathavan    schedule 12.01.2021
comment
Я получил ответ от этого stackoverflow. ком/вопросы/26610337/   -  person Mathavan    schedule 18.02.2021
comment
И, возможно, это также может помочь: stackoverflow.com/a/32414927/1016343   -  person Matt    schedule 12.04.2021