gpt4 book ai didi

c# - Entity Framework 外键关系不返回任何数据

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:46 25 4
gpt4 key购买 nike

我有两个表 orderorder_lines。他们都有主/外键关系。但是,当我尝试检索数据时,我没有从我的导航属性中看到任何数据。

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

我正在使用如下所示的 Linq 查询来获取数据。我希望看到填充了 OrderLines 属性,但它返回 0 个计数。

var data = (from o in Context.order
select o).ToList();

最佳答案

问题的原因是您忘记为外键定义一个属性。由于外键属性,我猜它会在您的 order_lines 表中。

我注意到你偏离了the entity framework code first conventions .这有充分的理由吗?这些偏差会使您的代码变得更大、更难理解、更难维护并且如果被其他人更改则更容易出错。

主要的偏差是您省略了外键的属性。另一个是您将一对多关系定义为 List<order_lines]而不是 ICollection<order_lines] .你确定MyOrder.Order_Lines[4]有明确的含义吗?

另外,你确定你查询的结果是一个真实的List吗?是否可能在内部数据库查询会返回类似于列表的内容,但实际上是其他内容,例如数组?您真的想将您自己和代码的用户限制在列表中吗?

此外还有您的一对多引用 OrderLinesOrder未声明为虚拟。它们不会是您表格中的列。

最后,您不拘泥于自己的命名约定,也不拘泥于 C# 常用的命名约定。类 order_lines有一个复数标识符,类 order有一个单一的标识符。 order_lines是小写字母,而你引用了order_lines的收藏以大写开头。除了OrderLines突然没有下划线了

虽然这是允许的,而且您的编译器也不会提示,但这些偏差需要多个属性或流畅的 API 才能使其正常工作。此外,这会使其他人更难阅读您的代码并理解您的表之间的关系。

所以我的建议是:坚持惯例,只有在确实需要时才偏离。不是因为“你忘记了”。

如果您坚持约定,那么您使用的大量代码和大部分属性都是不需要的。

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

因为我坚持约定,这就是 Entity Framework 理解一对多关系所需的全部内容。它知道哪些属性是您的主键,哪些是外键。唯一剩下的属性是 Sku 的最大长度

请注意,我将您的列表更改为 ICollection。此外,我删除了构造函数。在查询中,您的构造函数将创建一个列表,该列表将立即被查询结果替换:多么浪费!

最后我使用了标识符的专有名称。

引入具有多个 OrderLines 的新订单将按如下方式完成:

var addedOrder = myDbContext.Orders.Add(new Order()
{
Total = calculatedTotal, // or null

OrderLines = new OrderLines[]
{
new OrderLine() {Sku = ...; ...},
new OrderLine() {Sku = ...; ...},
new OrderLine() {Sku = ...; ...},
},
});

请注意,在此示例中,我创建了一个 arrayOrderLines .我定义了一个 ICollection。因此我也可以使用 ListOrderLine> ,或者(让我们疯狂)使用 Dictionary<int, OrderLine> 的值,或 ToList()一些查询。

我也可以像这样添加 OrderLines:

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

一切皆有可能,因为 Orders 和 OrderLines 之间的引用被声明为虚拟的和 ICollection。

关于c# - Entity Framework 外键关系不返回任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49483437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com