InvalidOperationException: výraz je neplatný uvnitř "Zahrnují" provoz, protože to nepředstavuje majetku

0

Otázka

Používám

  • Microsoft Visual Studio Společenství 2022 (64-bit) - Preview Verze 17.1.0 Náhled 1.1
  • .NET Framework Verze 4.8.04084
  • ASP.NET Core 5, Břitva Stránky (Není MVC)
  • Entity Framework 5

Dostanu "Neplatná Operace" výjimkou v následujícím kódu, a nejsem si jistý, proč.

V kostce, mám dva modely:

  1. Zkratka
  2. AcronymOld

Acronym má mnoho vztahů s AcronymOld.

Akronym:

public class Acronym
{
     [Key]
     public int Id { get; set; }

     [Required]
     [Display(Name = "Acronym")]
     [StringLength(50, ErrorMessage = "Acronym cannot be longer than 50 characters.")]
     public string Abbreviation { get; set; }

     [Required]
     [Display(Name = "Description")]
     [StringLength(100, ErrorMessage = "Description cannot be longer than 100 characters.")]
     public string Description { get; set; }

     [StringLength(250, ErrorMessage = "URL cannot be longer than 250 characters.")]
     public string URL { get; set; }

     public List<AcronymOld> AcronymsOld { get; set; }
}

AcronymOld:

public class AcronymOld
{
    [Key]
    public int Id { get; set; }

    [Required]
    [Display(Name = "Previous Acronym")]
    [StringLength(50, ErrorMessage = "Previous Acronym cannot be longer than 50 characters.")]
    public string Abbreviation { get; set; }

    [Required]
    [Display(Name = "Previous Acronym Description")]
    [StringLength(100, ErrorMessage = "Previous Acronym Description cannot be longer than 100 characters.")]
    public string Description { get; set; }

    [Display(Name = "Last Used")]
    public DateTime LastUsed { get; set; }

    //Acronym Can Have One or More AcronymOld
    [ForeignKey("AcronymId")]
    public int AcronymId { get; set; }
    public Acronym Acronym { get; set; }
}

Kód:

public class IndexModel : PageModel
{
    private readonly ApplicationDbContext _context;

    public IndexModel(ApplicationDbContext context)
    {
        _context = context;
    }

    public bool isDirty = false;

    public List<SelectListItem> Acronyms { get; set; }
    public IList<AcronymOld> AcronymOld { get; set; }

    [BindProperty(SupportsGet = true)]
    public string SearchString { get; set; }

    [BindProperty(SupportsGet = true)]
    public string SelectedAcronym { get; set; }

    public async Task OnGetAsync()
    {
        // Populate Acronym SelectList
        Acronyms = _context.Acronym.Select(a =>
                              new SelectListItem
                              {
                                  Value = a.Id.ToString(),
                                  Text = a.Abbreviation,
                              }).ToList();

        var acronymsOld = from m in _context.AcronymOld
                          select m;

        if (!string.IsNullOrEmpty(SelectedAcronym))
        {
            acronymsOld = acronymsOld.Where(m => m.Id == Int32.Parse(SelectedAcronym));
            isDirty = true;
        }

        if (!string.IsNullOrEmpty(SearchString))
        {
            if (isDirty == true)
            {
                // AcronymOld selected. Do not GroupBy
                acronymsOld = acronymsOld.Where(m => m.Abbreviation.Contains(SearchString));
            }
            else
            {
                //AcronymOld not selected. Use GroupBy
                acronymsOld = acronymsOld.Where(m => m.Abbreviation.Contains(SearchString));
            }
        }

        AcronymOld = await acronymsOld.Include(m => m.AcronymId)
            .OrderBy(m => m.Abbreviation)
            .AsNoTracking()
            .ToListAsync();
    }
}

Jsem stále chybu tady na tomto řádku:

AcronymOld = await acronymsOld.Include(m => m.AcronymId)
            .OrderBy(m => m.Abbreviation)
            .AsNoTracking()
            .ToListAsync();

Podrobná chyba:

InvalidOperationException: výraz 'm.AcronymId' je neplatný uvnitř "Zahrnují" provoz, protože to nepředstavuje přístup k vlastnosti: t => t.MyProperty'. Cíl navigace prohlásil na odvozené typy, použití odlitků (t => ((Odvozené)t).MyProperty'), nebo "jako" operátor ('t = > t (Odvozené).MyProperty'). Kolekce navigační přístup může být filtrován pomocí skládání Kde, řadit podle(Sestupně), ThenBy(Sestupně)

AcronymOld = čekají acronymsOld.Zahrnují(m => m.AcronymId)

1

Nejlepší odpověď

2

Musíte použít navigační vlastnost (m.Acronym - ne AcronymId hodnota) v .Include() - zkuste toto:

AcronymOld = await acronymsOld.Include(m => m.Acronym)
                              .OrderBy(m => m.Abbreviation)
                              .AsNoTracking()
                              .ToListAsync();
2021-11-23 06:07:52

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................