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);
}