Я создаю соединение БД следующим образом:
protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
{
optionbuilder.UseLazyLoadingProxies().UseSqlite(@"Data Source=Data.db");
}
И я пытаюсь получить доступ к объекту следующим образом:
public static User GetProfile(int uid)
{
using (Db db = new Db())
{
return db.Users.Include(x => x.Settings).FirstOrDefault(x => x.UserId == uid);
}
}
Пользовательский объект выглядит следующим образом:
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string Name { get; set; }
public DateTime? LastUsed{ get; set; }
public virtual Setting Settings { get; set; }
}
, но при доступе к Users.Settings
выдается следующая ошибка:
'Ошибка, сгенерированная для предупреждения' Microsoft.EntityFrameworkCore.Infrastructure.LazyLoadOnDisposedContextWarning: была сделана попытка выполнить lazy-загрузить свойство навигации «Настройки» для типа объекта «UserProxy» после удаления соответствующего DbContext. '.Это исключение можно подавить или зарегистрировать, передав идентификатор события «CoreEventId.LazyLoadOnDisposedContextWarning» методу «ConfigureWarnings» в «DbContext.OnConfiguring» или «AddDbContext».
Я понимаю, что это значит, но этоЭто противоречит моему пониманию включений и тому, как оно вызывает нетерпеливую загрузку.
Насколько я понимаю, при использовании include
и явном доступе к объекту с помощью вызова FirstOrDefault
нетерпеливо загружаются связанные объекты, которые должны быть немедленно заполнены безнеобходимо, чтобы соединение БД оставалось открытым;но, видимо, это не так.
Как правильно сделать это, не оставляя базу данных открытой?