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

时间:2015-03-16 15:02:29

标签: c# entity-framework ef-code-first 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; }

}

二级

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

我正在尝试从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;

consumableGood始终返回null。提前谢谢。

1 个答案:

答案 0 :(得分:5)

我认为你所寻找的是延迟加载相关实体。为此,您需要将导航属性指定为virtual。从page

开始
  

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

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

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

    public virtual  ICollection<OrderItem> OrderItems { get; set; }
{

在这个link中,您将找到支持延迟加载所需的所有要求。