Entity Framework Core всегда возвращает пустой список внешних строк - PullRequest
0 голосов
/ 13 февраля 2020

Я работаю с Entity Framework Core и ASP. NET Core 3.1.

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

public class UserModel 
{
        public int    UserModelId   { get; set; }
        public string Email         { get; set; }
        public string Password      { get; set; }
        public string Name          { get; set; }
        public string Surname       { get; set; }
        public string Token         { get; set; }

        public List<TherapyModel> Therapies { get; set; }
}

public class TherapyModel 
{
        public int      TherapyModelId  { get; set; }
        public int      UserModelId     { get; set; }
        public string   Title           { get; set; }
        public int      Quantity        { get; set; }
        public bool     Monday          { get; set; }
        public bool     Tuesday         { get; set; }
        public bool     Wednesday       { get; set; }
        public bool     Thursday        { get; set; }
        public bool     Friday          { get; set; }
        public bool     Saturday        { get; set; }
        public bool     Sunday          { get; set; }
        public string   ImgBase64       { get; set; }
        public string   ImgUrl          { get; set; }

        public int UserModelForeignKey { get; set; }
        public UserModel UserModel           { get; set; }
}

Теперь я инициализирую все в этом way:

public class DatabaseManager : DbContext 
{
        //Entities:
        public DbSet<UserModel>     UserModel    { get; set; }
        public DbSet<TherapyModel>  TherapyModel { get; set; }

        protected override void OnModelCreating( ModelBuilder modelBuilder ) 
        {
            modelBuilder.Entity<TherapyModel>().HasOne(p => p.UserModel)
                                               .WithMany(s => s.Therapies)
                                               .HasForeignKey(p => p.UserModelForeignKey);
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            => optionsBuilder.UseMySql( @"Server=127.0.0.1;database=test2;uid=root;pwd=" ); );
}

Локальная база данных заполнена правильно, с правильными внешними ключами. Фактически этот запрос возвращает 3 строки:

select * 
from usermodel 
join therapymodel on therapymodel.UserModelForeignKey 

Но, по какой-то причине, когда я пытаюсь получить UserModel из моего кода C#, он всегда возвращает "Therapies" как NULL. Я получаю UserModel двумя способами:

UserModel user = dbManager.UserModel.FirstOrDefault( user => user.UserModelId == iUserModel.UserModelId );

var users = dbManager.UserModel;

Терапии как для пользователя, так и для пользователей имеют значение NULL. Я действительно не могу понять почему. Любая помощь?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Хорошо, я наконец нашел ответ. Прочитав этот пост:

https://www.learnentityframeworkcore.com/lazy-loading

Я включил Lazy-Loading (включен по умолчанию), но внешний ключ должен быть виртуальным :

public class Author
{
    public int AuthorId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual List<Book> Books { get; set; } = new List<Book>();
}
public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public int AuthorId { get; set; }
    public virtual Author Author { get; set; }
}

Теперь, когда это работает, Учебное пособие Microsoft не говорит вам ничего о отложенной загрузке и факте объявления внешнего ключа как виртуального. Я надеюсь, что это может помочь кому-нибудь в будущем.

0 голосов
/ 13 февраля 2020

Вам нужно срочно загрузить Therapies, например:

UserModel user = dbManager.UserModel.Where( user => user.UserModelId == iUserModel.UserModelId ).Include( user => user.Therapies ).SingleOrDefault();

Используя SingleOrDefault, потому что, поскольку вы запрашиваете по первичному ключу, на самом деле должна быть не более одной записи. Подробнее здесь: https://docs.microsoft.com/en-us/ef/core/querying/related-data.

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