【发布时间】:2017-03-16 08:48:29
【问题描述】:
Entity Framework 6. Get include property throws error does not declare a navigation property 我必须实体:
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; }
}
在上下文中我这样做:
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);
}
在数据库中的结果是:
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
如果我跑:
using (var context = new DataModelsDbContext())
{
list = context.rowDocSale.Include(p => p.VatRate).Take(10).ToList();
}
Assert.AreEqual(1, list[0].VatRate.id);
工作正常
但如果我跑:
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);
我收到一个错误
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'.
我不明白可能出了什么问题...
【问题讨论】:
-
能否添加产品数据库集的注册码(即
public DbSet<Product> Products { get; set; })?在有效的代码 sn-p 中,您访问的是context.rowDocSale...而不是context.RowDocSale。会不会是 DataModelsDbContext 上的 DbSet 属性被声明为rowDocSale和products?如果是,请尝试访问context.products。 -
已编辑。我可以访问产品。但是,如果我将 Include(p => p.VatRate) 与产品一起使用,则会出现错误。如果我将 Include(p => p.VatRate) 与 RowDocumentSale 一起使用,一切正常
-
好的,谢谢。我在配置中看不到任何问题...我会尽快再看看你的问题。
-
更改实体的属性名称,然后尝试我不确定,但这可能是问题
public virtual VatRate VatRates { get; set; } -
您的 Product 和 RowDocumentSale 类中是否定义了主键?类似于:[Key] public int Id { get;放; }
标签: postgresql entity-framework c#-4.0 navigation-properties