linqToSql相关表没有延迟正确加载。根本没有填充

时间:2009-03-12 21:15:54

标签: linq linq-to-sql

我有几张与标准Order,OrderLine表具有相似关系结构的表。
在创建数据上下文时,它为Order类提供了一个OrderLines属性,该属性应使用该特定Order对象的OrderLine对象填充。
当然,默认情况下它会延迟加载OrderLine属性中的东西,但这应该是相当透明的吗?

好的,这是我遇到的问题:当我走MyOrder.OrderLines时,我得到一个空列表但是当我走myDataContext.OrderLines.Where(line => line.OrderId == 1)时,我得到了正确的列表。

public void B()
{
  var dbContext = new Adis.CA.Repository.Database.CaDataContext(
    "<connectionString>");
  dbContext.Connection.Open();
  dbContext.Transaction = dbContext.Connection.BeginTransaction();
  try
  {
    //!!!Edit: Imortant to note that the order with orderID=1 already exists 
    //!!!in the database

    //just add some new order lines to make sure there are some
    var NewOrderLines = new List<OrderLines>()
    {
      new OrderLine() { OrderID=1, LineID=300 },
      new OrderLine() { OrderID=1, LineID=301 },
      new OrderLine() { OrderID=1, LineID=302 },
      new OrderLine() { OrderID=1, LineID=303 }
    };

    dbContext.OrderLines.InsertAllOnSubmit(NewOrderLines);
    dbContext.SubmitChanges();

    //this will give me the 4 rows I just inserted
    var orderLinesDirect = dbContext.OrderLines
          .Where(orderLine => orderLine.OrderID == 1);

    var order = dbContext.Orders.Where(order => order.OrderID == 1);
    //this will be an empty list
    var orderLinesThroughOrder = order.OrderLines;
  }
  catch (System.Data.SqlClient.SqlException e)
  {
    dbContext.Transaction.Rollback();
    throw;
  }
  finally
  {
    dbContext.Transaction.Rollback();
    dbContext.Dispose();
    dbContext = null;
  }
}

据我所见,我没有做任何特别奇怪的事情,但我认为orderLinesDirectorderLinesThroughOrder会给我相同的结果集。
谁能告诉我为什么不呢?

1 个答案:

答案 0 :(得分:1)

您只是添加OrderLines;没有任何实际的订单。所以dbContext.Orders上的Where返回一个空列表。

如何按顺序找到订单属性OrderLines我不明白,所以我可能会在这里搞砸。

<强> [编辑] 您能否更新示例以显示实际类型,尤其是订单变量? Imo,它应该是IQueryable<Order>,但奇怪的是你可以.OrderLines。尝试在Where。

之后添加First()FirstOrDefault()