Ленивая загрузка EF Core 2.1 не работает с Identity? - PullRequest
0 голосов
/ 06 июня 2018

Я последовал примеру здесь

https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading

И мои два класса выглядят так

  public class RefMedSchool
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }


    public virtual ICollection<ApplicationUser> ApplicationUser { get; set; }
}


 public class ApplicationUser : IdentityUser
{
    public string UserFirstName { get; set; }
    public string UserLastName { get; set; }
    public bool MustChangePassword { get; set; }


    public int? MedicalSpecialtyId { get; set; }
    [ForeignKey("RefMedicalSpecialtyForeignKey")]
    public RefMedicalSpecialty RefMedicalSpecialty { get; set; }


    public int RefMedSchoolId { get; set; }
    public virtual RefMedSchool RefMedSchool { get; set; }


    public UserProfileData UserProfileData { get; set; }


    public ICollection<UserFeedback> UserFeedbacks { get; set; }


    public ICollection<UserAction> UserActions { get; set; }


    public ICollection<UserProgram> UserPrograms { get; set; }
}

Но когда база данных пытается быть создана, я получаюошибка ниже.В чем дело ?При необходимости свойства являются виртуальными.

System.InvalidOperationException: «Свойство навигации« RefMedicalSpecialty »для типа объекта« ApplicationUser »не является виртуальным.UseLazyLoadingProxies требует, чтобы все типы сущностей были общедоступными, незапечатанными, имели свойства виртуальной навигации и имели открытый или защищенный конструктор. '

1 Ответ

0 голосов
/ 06 июня 2018

В Entity Framework Core 2.1 введена ленивая загрузка.Требуется, чтобы все свойства навигации были виртуальными, как объяснено в проблеме Ленивая загрузка прокси: позволяют указывать типы / навигационные объекты :

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

Проблема по-прежнему открыта и не имеет разрешения, поэтому желаемый сценарий по-прежнему не поддерживается.

И, как говорит исключение:

UseLazyLoadingProxies требует, чтобы все типы сущностей были открытыми, незапечатанными, имели свойства виртуальной навигации и имели открытый или защищенный конструктор.

Итак, измените все свойства навигации (то есть свойства, относящиеся к другим объектам) на virtual.

Или используйте ILazyLoader, как описано в Ленивая загрузка без прокси :

public class Blog
{
    private ICollection<Post> _posts;

    public Blog()
    {
    }

    private Blog(ILazyLoader lazyLoader)
    {
        LazyLoader = lazyLoader;
    }

    private ILazyLoader LazyLoader { get; set; }

    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Post> Posts
    {
        get => LazyLoader?.Load(this, ref _posts);
        set => _posts = value;
    }
}
...