首页 > 解决方案 > 首先创建导航代码会导致错误:未声明具有名称的导航属性

问题描述

query.Include("Store_Location").Load();

抛出:

EntityFramework.SqlServer.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:指定的包含路径无效。EntityType“Model.Order”未声明名为“Store_Location”的导航属性。

我使用以下代码首先创建导航代码:

public partial class Order
{

    public Nullable<int> Store_Location_ID { get; set; }

    public virtual Store_Location Store_Location { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]

}



public partial class Store_Location
{

    public int ID { get; set; }

    public virtual ICollection<Order> Orders { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]

}

https://docs.microsoft.com/en-us/ef/ef6/fundamentals/relationships

我需要使用设计器吗?为了创建导航,我需要做些什么吗?

标签: asp.net

解决方案


如果您使用代码优先方法创建数据库,那么您的实体不应该是部分类。像这样定义它们:

public class Order
{
    public int? StoreLocationId { get; set; }
    public virtual StoreLocation StoreLocation { get; set; }
}


public class StoreLocation
{
    public int Id { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}

然后你应该创建一个 DbContext 类:

 public class StoreDbContext : DbContext
 {
        public StoreDbContext(DbContextOptions<StoreDbContext> options) : base(options)
        {
        }

        public virtual DbSet<StoreLocation> StoreLocations { get; set; }
        public virtual DbSet<Order> Orders { get; set; }
 }

创建上下文后,您可以使用 ef 命令创建数据库。您可以在此处阅读有关 ef 核心的更多信息:https ://docs.microsoft.com/en-us/ef/core/get-started/?tabs=netcore-cli

如果你像我上面那样定义你的类,你可以包括你的导航属性强类型如下:

query.Include(order => order.StoreLocation);

推荐阅读