Search code examples
postgresqlentity-frameworkc#-4.0navigation-properties

Entity Framework 6. Get include property throws error does not declare a navigation property


Entity Framework 6. Get include property throws error does not declare a navigation property I have to entities:

class Product
{
        public virtual int? vatrateID { get; set; }
        public virtual VatRate VatRate { get; set; }
}
class RowDocumentSale
{
        public virtual int? vatrateID { get; set; }
        public virtual VatRate VatRate { get; set; }
}

In context I do:

public DbSet<Product> Products { get; set; }
public DbSet<RowDocumentSale> rowDocSale { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<RowDocumentSale>().HasOptional(o => o.VatRate).WithMany().HasForeignKey(k => k.vatrateID);
        modelBuilder.Entity<RowDocumentSale>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("RowDocumentSales");
        })
            .HasKey(k => k.id).Property(k => k.id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

    modelBuilder.Entity<Product>().HasOptional(o => o.VatRate).WithMany().HasForeignKey(k => k.vatrateID);
        modelBuilder.Entity<Product>()
            .HasKey(k => k.productID)
                            .Map(m =>
                            {
                                m.MapInheritedProperties();
                                m.ToTable("products");
                            })
            .Property(k => k.productID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

In DataBase result is:

table RowDocumentSales
  "vatrateID" integer,
    CONSTRAINT "FK_dbo.RowDocumentSales_dbo.VatRates_vatrateID" FOREIGN KEY ("vatrateID")
      REFERENCES dbo."VatRates" (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,

table Product
  "vatrateID" integer,
    CONSTRAINT "FK_dbo.products_dbo.VatRates_vatrateID" FOREIGN KEY ("vatrateID")
      REFERENCES dbo."VatRates" (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION

If i run:

            using (var context = new DataModelsDbContext())
        {
            list = context.rowDocSale.Include(p => p.VatRate).Take(10).ToList();
        }
        Assert.AreEqual(1, list[0].VatRate.id);

Works fine

But If I run:

    List<Product> list;
    using (var context = new DataModelsDbContext())
    {
        list = context.Products.Include(p => p.VatRate).Take(10).ToList();
    }
    Assert.AreEqual(1, list[0].VatRate.id);

I get an error

Additional information: A specified Include path is not valid. The EntityType 'WebApplication1.Models.DataModels.Product' does not declare a navigation property with the name 'VatRate'.

I cant't understand what could be wrong...


Solution

  • Solved: I Don't know why, but this helped: it was:

    public class Product : BaseModel, IExportable
    {
        public virtual VatRate VatRate { get; set; }
    }
    

    Now is:

    public class Product : BaseModel, IExportable
    {
        public virtual VatRate VatRate_ { get; set; }
    }