简体   繁体   中英

Invalid inside an 'Include' operation, since it does not represent a property access: 't => t.MyProperty'

I'm getting the following error on an Entity Framework Core MVC app. Can anyone help with why? I'm including simplified versions of my Models below.

InvalidOperationException: The expression 'b.BrandId' is invalid inside an 'Include' operation, since it does not represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, use casting ('t => ((Derived)t).MyProperty') or the 'as' operator ('t => (t as Derived).MyProperty'). Collection navigation access can be filtered by composing Where, OrderBy(Descending), ThenBy(Descending), Skip or Take operations.

I have a Products table and a Brands table. Brands are unique and Products can only have one Brand, but there can be many Products for a single Brand.

The Products model and Brand model:

public class Product
{
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int BrandId { get; set; } 
    
    public virtual Brand Brand { get; set; }

    public Product()
    {
        Brand = new Brand();
    }
}

public class Brand
{
    public int BrandId { get; set; }
    
    public string BrandName { get; set; }
}

Then in my ProductsController this is what throws the above error. The include Brand part is so I can show the BrandName on my Index page and it is there that the error can be traced to:

// GET: Products
public async Task<IActionResult> Index()
{
    return View(await _context.Products.Include(b => b.Brand)
        .OrderByDescending(d => d.CreatedDate)
        .AsNoTracking().ToListAsync());
}

Your classes are not properly configured and don't create any constructor:

public class Product
{
    [Key]
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int BrandId { get; set; } 
     [ForeignKey(nameof(BrandId))]
     [InverseProperty("Products")]
    public virtual Brand Brand { get; set; }
}

public class Brand
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    [InverseProperty(nameof(Product.Brand))]
    public virtual  ICollection<Product> Products{ get; set; }
}

This can also help as well

var results = _context.Orders.Include(x => x.Customer).Include(p=>p.FoodType).ToList();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM