Стремительная загрузка включает использование UseLazyLoadingProxies - PullRequest
2 голосов
/ 27 марта 2019

Я создаю соединение БД следующим образом:

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 нетерпеливо загружаются связанные объекты, которые должны быть немедленно заполнены безнеобходимо, чтобы соединение БД оставалось открытым;но, видимо, это не так.

Как правильно сделать это, не оставляя базу данных открытой?

1 Ответ

1 голос
/ 28 марта 2019

Auther V, разработчик, работающий над EFC, подтвердил, что это ошибка.

https://github.com/aspnet/EntityFrameworkCore/issues/15170

Документация об этом изменении

Это исправлено в EF Core 3.0.0 RC4, но на момент написания этой статьи недоступнов открытом доступе.Лично я бы не советовал использовать RC4, так как он все еще находится в разработке и плохо подходит для общего или производственного использования.

Сейчас вы можете устранить ошибку следующим образом:

protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
{
    optionbuilder.UseSqlite(@"Data Source=Data.db").UseLazyLoadingProxies();
    optionbuilder.ConfigureWarnings(w => w.Ignore(CoreEventId.LazyLoadOnDisposedContextWarning));
}

Строка optionbuilder.ConfigureWarnings(w => w.Ignore(CoreEventId.LazyLoadOnDisposedContextWarning)); - это то, что вам нужно.

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

...