Code First选择数据 - 相关实体始终返回null

LIH*_*LIH 3 c# entity-framework code-first ef-code-first

我正在尝试使用Entity Framework实现一个系统.这是我的两个班级

一级

public class ConsumableGood
{
    public ConsumableGood() { }

    public Guid ConsumableGoodId { get; set; }
    public string ConsumableGoodName { get; set; }
    public string ConsumableGoodPrice { get; set; }
    public virtual Category Category { get; set; }

    public ICollection<ConsumableGoodsStock> ConsumableGoodsStocks { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

第二类

public class ConsumableGoodsStock
{
    public ConsumableGoodsStock()
    {

    }

    public Guid ConsumableGoodsStockId { get; set; }
    public double ConsumableGoodPriceIn { get; set; }
    public double ConsumableGoodPriceOut { get; set; }
    public int ConsumableGoodQuantity { get; set; }
    public ConsumableGood ConsumableGood { get; set; }

    public ICollection<OrderItem> OrderItems { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试从ConsumableGoodsStock中选择记录.但问题是每次ConsumableGood都返回null,尽管它有一个值.这是我正在尝试使用的代码.

DataTable table = new DataTable();
table.Columns.Add("Consumable Good");
table.Columns.Add("Price In");
table.Columns.Add("Price Out");
table.Columns.Add("Quantity");

var ConsumableGoodsStocks = from db in em.ConsumableGoodsStocks select db;

foreach (var consumableGoodStock in ConsumableGoodsStocks)
{
    DataRow row = table.NewRow();
    ConsumableGood consumableGood = consumableGoodStock.ConsumableGood;
    row[0] = consumableGood.ConsumableGoodName.ToString();
    row[1] = consumableGoodStock.ConsumableGoodPriceIn.ToString();
    row[2] = consumableGoodStock.ConsumableGoodPriceOut.ToString();
    row[3] = consumableGoodStock.ConsumableGoodQuantity.ToString();
    table.Rows.Add(row);
}
return table;
Run Code Online (Sandbox Code Playgroud)

consumableGood总是返回null.提前致谢.

oct*_*ccl 6

我认为你所寻找的是延迟加载相关实体.为此,您需要将导航属性指定为virtual.从这个页面:

延迟加载是在第一次访问引用实体/实体的属性时从数据库自动加载实体或实体集合的过程.使用POCO实体类型时,通过创建派生代理类型的实例然后重写虚拟属性以添加加载挂钩来实现延迟加载.

virtual在导航属性中指定关键字时,EF会在运行时为您的实体类创建动态代理.这些代理类负责相关实体的延迟加载行为.如果没有虚拟,则不支持延迟加载,并且导航属性上的null为空.所以你需要这样做:

public class ConsumableGoodsStock
{
    //...
    public virtual ConsumableGood ConsumableGood { get; set; }

    public virtual  ICollection<OrderItem> OrderItems { get; set; }
{
Run Code Online (Sandbox Code Playgroud)

在此链接中,您将找到支持延迟加载所需的所有要求.