Ef Core Linq Query ThenInclude, генерирующее InvalidOperationException: метод EF.Property <T>может использоваться только в запросах LINQ. - PullRequest
3 голосов
/ 09 апреля 2019

Я пытаюсь получить полностью заполненный объект User, включая связанную таблицу Adress, а затем включить Plz_Ort.

public partial class User
{
    //No hash sets for Adress Scaffolded (probably unnecessary since the is 
    //only ever one address per user

    public int IdUser { get; set; }
    public int? FidAdresse { get; set; }
    public string Email { get; set; }
    public string Vorname { get; set; }
    public string Nachmname { get; set; }

    [ForeignKey("FidAdresse")]
    [InverseProperty("User")]
    public virtual Adresse FidAdresseNavigation { get; set; }
}

public partial class Adresse
{
    public Adresse()
    {
        User = new HashSet<User>();
    }

    public int IdAdresse { get; set; }
    public int FidPlzOrt { get; set; }
    public string Strasse { get; set; }
    public string Hausnr { get; set; }

    [ForeignKey("FidPlzOrt")]
    [InverseProperty("Adresse")]
    public virtual PlzOrt FidPlzOrtNavigation { get; set; }
    [InverseProperty("FidAdresseNavigation")]
    public virtual ICollection<User> User { get; set; }
}

public partial class PlzOrt
{
    public PlzOrt()
    {
        Adresse = new HashSet<Adresse>();
    }

    public int IdPlzOrt { get; set; }
    public string Plz { get; set; }
    public string Ort { get; set; }

    [InverseProperty("FidPlzOrtNavigation")]
    public virtual ICollection<Adresse> Adresse { get; set; }
}

Отношения таковы: Пользователь 1: 1 Адрес и Адрес n: 1 Plz_ort.

Затем я делаю запрос linq, который выдает исключение : «Метод EF.Property может использоваться только в запросах LINQ.»

return _context.User
            .Include(u => u.FidPermissionNavigation)
            .Include(c => c.FidAdresseNavigation)
                .ThenInclude(c => c.FidPlzOrtNavigation)
            .FirstOrDefault(c => c.IdUser == id);

Этот запрос работает, когда я закомментирую «theninclude (c => c.FidPlzOrtNavigation)». Я получаю объект с плзнавигацией, установленной как ноль.

Этот запрос работает нормально.

return _context.Adresse
            .Include(c => c.FidPlzOrtNavigation)
            .FirstOrDefault(c => c.IdAdresse == idAddresse);

Есть идеи как это исправить? Или я вообще не должен пытаться запрашивать объекты с таким большим количеством связанных данных?

UPDATE

Я строил все эти таблицы БД Сначала с Помело. Видимо, эшафот проигнорировал все мои отношения 1: 1 и решил сделать их все 1: n. Вот сгенерированный код для dbcontext.

modelBuilder.Entity<User>(entity =>
            {
                entity.HasKey(e => e.IdUser)
                    .HasName("PRIMARY");

                entity.HasIndex(e => e.FidAdresse)
                    .HasName("fk_User_Adresse1_idx");

                entity.HasOne(d => d.FidAdresseNavigation)
                    .WithMany(p => p.User)
                    .HasForeignKey(d => d.FidAdresse)
                    .HasConstraintName("fk_User_Adresse1");
            });

    modelBuilder.Entity<Adresse>(entity =>
            {
                entity.HasKey(e => e.IdAdresse)
                    .HasName("PRIMARY");

                entity.HasIndex(e => e.FidPlzOrt)
                    .HasName("fk_Adresse_plz_ort1_idx");

                entity.HasOne(d => d.FidPlzOrtNavigation)
                    .WithMany(p => p.Adresse)
                    .HasForeignKey(d => d.FidPlzOrt)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("fk_Adresse_plz_ort1");
            });

    modelBuilder.Entity<PlzOrt>(entity =>
            {
                entity.HasKey(e => e.IdPlzOrt)
                    .HasName("PRIMARY");
            });

В случае, если эшафот создал неправильные отношения для сущностей, я обновлю этот пост на новый заголовок и перефразирую этот пост.

Все мои отношения 1: 1 определены как неидентифицируемые Как заставить Помело правильно построить отношения 1: 1? Я попытался удалить и добавить соотношение 1: 1 между пользователем и адресом и синхронизировал изменения EER с БД. После этого я поменял изменения с помощью --force, чтобы сущности были перезаписаны, но DBContext все равно не изменил сущность вообще.

...