@gvpugachev
Разработчик Delphi, Go, FrontEnd

Как получать данные каскадно из базы?

Здравствуйте, есть два связанных класса-entity
User
Source

public class User {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        [Required]
        public Guid Guid { get; set; }
        [Required]
        public string Name { get; set; }

        [ForeignKey("Company")]
        public Guid? CompanyGuid { get; set; }
        public virtual Company Company { get; set; }
}


Company
Source

public class Company {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    [Required]
    public Guid Guid { get; set; }
    [Required]
    public string Name { get; set; }

    public virtual ICollection<User> Users { get; set; }

    public Company() {
        Users = new List<User>();
    }
}



Их Context
Source

public class CompanyContext : DbContext
    {
       public CompanyContext (DbContextOptions<CompanyContext> options) : base(options) {
        }

        public DbSet<Company> Company { get; set; }
        public DbSet<User> User { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder) {
            modelBuilder.Entity<User>()
                .HasOne(p => p.Company)
                .WithMany(b => b.Users)
                .HasForeignKey(p => p.CompanyGuid);

            modelBuilder.Entity<Company>()
                .HasMany(b => b.Users)
                .WithOne();
        }
    }


В базе всё создаётся правильно, Foreign key присутствует. Данные в базе также присутствуют.
Но при выполнении следующего кода, я получаю User.Company = null
Source

User user = db.User.FirstOrDefault(x => x.Name == name);
if (user == null) {
    // to do something
}

if (user.Company == null) {
    // <- Company null хотя не должен быть.
}



Подскажите, пожалуйста, что я делаю не правильно.
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
@MaratFakhrutdinov
Вам нужно добавить навигационное свойство в Include. Entity Framework сгенерирует Вам Join и нужные столбцы транслирует в объект Company, присвоив его соответствующему свойству.
User user = db.User
.Where(u => u.Name == name)
.Include(u => u.Company)
.FirstOrDefault();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы