Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架外键关系不返回任何数据_C#_Entity Framework_Linq - Fatal编程技术网

C# 实体框架外键关系不返回任何数据

C# 实体框架外键关系不返回任何数据,c#,entity-framework,linq,C#,Entity Framework,Linq,我有两个表订单和订单行。它们都具有主键/外键关系。但是,当我尝试检索数据时,我看不到来自导航属性的任何数据 [Table("order")] public class order : BaseModel { public order() { this.OrderLines = new List<order_lines>(); } [Key] [DatabaseGenerated(DatabaseGeneratedOption.

我有两个表
订单
订单行
。它们都具有主键/外键关系。但是,当我尝试检索数据时,我看不到来自导航属性的任何数据

[Table("order")]
public class order : BaseModel
{
    public order()
    {
        this.OrderLines = new List<order_lines>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }
    public double? total { get; set; }

    public List<order_lines> OrderLines { get; set; }
}

[Table("order_lines")]
public class order_lines : BaseModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }
    public int? ordernum { get; set; }
    [MaxLength(1000)]
    public string sku { get; set; }

    [ForeignKey("id")]
    public order Order { get; set; }
}

您将外键设置为pk。我认为应该是“orderId”而不是“id”

您的列表需要引用该属性。添加
属性
[InverseProperty(“Order”)]
并将类型更改为ICollection:

[InverseProperty("Order")] // Select the property-name of the Other class
public ICollection<order_lines> OrderLines { get; set; }
[InverseProperty(“Order”)]//选择另一个类的属性名称
公共ICollection命令行{get;set;}

问题的原因是您忘记为外键定义属性。由于外键属性,我想它将出现在order_lines表中

我注意到你偏离了。有什么好的理由吗?这些偏差使您的代码更大、更难理解、更难维护,如果被他人更改,则更容易出错

主要的偏差是您省略了外键的属性。另一个问题是,您将一对多关系定义为
列表,或者(让我们疯狂地说)使用
字典的值,或者某个查询的
ToList()

我还可以像这样添加订单行:

var addedOrder = myDbContext.Orders.Add(new Order()
{
     OrderLines = new List<OrderLine>(),
});
addedOrder.OrderLines.Add(new OrderLine() {...};

由于订单和订单行之间的引用被声明为虚拟和ICollection,因此所有这些都成为可能。

如果您不使用标准命名约定,则必须在上下文中执行以下操作以解决此问题

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Orders>()
            .HasKey(e => e.CaregiverCode)
            .HasMany(e => e.OrderLines)
            .WithOptional(e => e.Orders)
            .HasForeignKey(e => e.ordernum);
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasKey(e=>e.HasKey代码)
.HasMany(e=>e.OrderLines)
.with可选(e=>e.Orders)
.HasForeignKey(e=>e.ordernum);
}

我使用第三方应用程序生成模型,这就是为什么您会看到各种命名问题。我使用modelBuilder解决了这个问题。EF不需要实体APIVirtual。只有使用EF特性延迟加载时才需要它。
class Order : BaseModel
{
    public int Id { get; set; }

    // every Order has zero or more OrderLines
    public virtual ICollection <OrderLines> OrderLines { get; set; }

    public double? Total { get; set; }
}

public class OrderLines : BaseModel
{
    public int id { get; set; }

    // every OrderLine belongs to exactly one Order, using foreign key
    public int OrderId {get; set;}
    public virtual Order Order { get; set; }

    public int? Ordernum { get; set; }
    [MaxLength(1000)]
    public string Sku { get; set; }
}
var addedOrder = myDbContext.Orders.Add(new Order()
{
     Total = calculatedTotal, // or null

     OrderLines = new OrderLines[]
     {
          new OrderLine() {Sku = ...; ...},
          new OrderLine() {Sku = ...; ...},
          new OrderLine() {Sku = ...; ...},
     },
});
var addedOrder = myDbContext.Orders.Add(new Order()
{
     OrderLines = new List<OrderLine>(),
});
addedOrder.OrderLines.Add(new OrderLine() {...};
var addedOrder = myDbContext.OrderLines.Add(new OrderLine()
{
     Order = addedOrder,
     ...
});
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Orders>()
            .HasKey(e => e.CaregiverCode)
            .HasMany(e => e.OrderLines)
            .WithOptional(e => e.Orders)
            .HasForeignKey(e => e.ordernum);
    }