1

我正在关注有关 Silverlight 和 Prism的教程,其中WCF RIA 服务用于通过ADO.NET Entity Data Model访问Northwind 数据库

在 Northwind 数据库中,有一个表 Order_Details 通过外键连接到另外两个表(Orders 和 Products):

数据模型图片

查询数据库的代码如下所示:

EntityQuery<Order_Detail> detailQuery = _MyDomainContext.GetOrder_DetailsQuery();

_MyDomainContext.Load(detailQuery.Where(
            det => det.Order.Customer.CustomerID == cust.CustomerID).OrderByDescending(
            det => det.Order.OrderDate).Take(10), OnDetailsLoaded, null);

然后在 OnDetailsLoaded 中:

var details = loadOp.Entities;
if (details != null)
        {
            var detailsList = details.ToList();
            detailsList.ForEach(det => Orders.Add(
                new OrderItem
                {
                    ProductName = det.Product.ProductName,
                    Quantity = det.Quantity,
                    OrderDate = det.Order.OrderDate.Value
                }));

这给了我一个空异常new OrderItem,因为 Product 和 Order 都是空的。我已将 EntityDataModel 设置为“在模型中包含外键列”。代码与教程中的完全一样,我只需要重新创建 ADO.Net EntityDataModel 和 DomainService 即可使用我的本地数据库,因此错误可能就在那里。

我将如何调试此错误?我以前没有使用数据库的经验。我将 SQL Server 2012 与适用于 2012 的 Northwind 数据库一起使用,而本教程是使用 SQL Server 2008 RC 编写的。

4

2 回答 2

1

您可能需要在加载方法中明确包含 Product / Order。尝试做一个

.Include("Order").Include("Product")

在域上下文加载中。

于 2012-07-26T16:08:08.870 回答
1

这是我必须做的来解决这个问题。Josh 的回答是解决方案的一部分,但我还必须在元数据中添加 [Include] 属性:

在 MyDomainService.cs 中,添加.Include()

public IQueryable<Order_Detail> GetOrder_Details()
    {
        return this.ObjectContext.Order_Details.Include("Order").Include("Product");
    }

在 MyDomainService.metadata.cs 中,添加[Include]

internal sealed class Order_DetailMetadata
    {

        // Metadata classes are not meant to be instantiated.
        private Order_DetailMetadata()
        {
        }


        [Include]
        public Order Order { get; set; }           

        [Include]
        public Product Product { get; set; }


    }
}

这在这个网站上有详细描述,感谢Brian Noyes向我指出。

于 2012-07-31T11:04:14.600 回答