0

谁能解释为什么我有时会在这个插入方法上得到一个 NULL 异常?正如所说的只是有时,这对我来说更加令人困惑。

表 OrderLine 具有对数据上下文(.dbml 文件)中表 Product 的引用

public void insertNewOrder(string accountNumber, int orderId)
{
    var order = orderRep.GetOrderById(orderId);
    var orderlineData = orderLineRep.GetOrderLines(order.OrderID);

    foreach (var orderLine in orderlineData)
    {
        int currentStatus = dlvRep.getAxOrderStatusNumber(orderLine.ItemNumber, 0);
        string levering = "";
        string status = dlvRep.getAxOrderStatus(orderLine.ItemNumber, currentStatus, out levering);
        WebsiteOrderStatus insertNew = new WebsiteOrderStatus
        {
                AccountNumber = accountNumber,
                OrderID = orderId,
                ItemNumber = orderLine.ItemNumber,
                ItemName = orderLine.Product.Name,
                FormatName = orderLine.Product.ProductFormatName,
                Quantity = orderLine.Quantity,
                Price = orderLine.Price,
                Status = status,
                Levering = levering,
                LastUpdatedStatus = currentStatus,
                CreatedDate = DateTime.Now
        };
        db.WebsiteOrderStatus.InsertOnSubmit(insertNew);
        db.SubmitChanges();
    }
}

异常消息:

Cannot insert the value NULL into column 'FormatName', table 'GWportal.dbo.WebsiteOrderStatus'; column does not allow nulls. INSERT fails.

该语句已终止。

当我查找此代码无法找到 ProductFormatName 的产品时。ProductFormatName 的值不是 NULL,它具有我预期的值,例如:“PS3”。

另一个奇怪的是,它为什么不抱怨:

ItemName = orderLine.Product.Name,

该库也不允许空值。

4

1 回答 1

2

这可能是代码中的错误orderLineRep.GetOrderLines(order.OrderID)导致orderLine.Product.ProductFormatName设置为null.

尝试添加一些调试代码:

    foreach (var orderLine in orderlineData)
    {
        if (orderLine.Product.ProductFormatName == null) {
            throw new Exception("ProductFormatName == null");
        }

        // ...

另一个奇怪的是,它为什么不抱怨:

ItemName = orderLine.Product.Name,

该库也不允许空值。

我能想到两种解释:

  1. orderLine.Product.Name不为空。上面提到的错误可能只影响ProductFormatName.
  2. orderLine.Product.Name为空,但一个错误足以立即终止该语句。只会报告一个错误。在修复第一个错误之前,不会报告同样存在的其他错误。
于 2012-04-28T13:17:28.570 回答