我正在尝试使用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。提前谢谢。
答案 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中,您将找到支持延迟加载所需的所有要求。