WCF RIA EntityQuery为外键返回null

时间:2012-07-26 14:18:09

标签: silverlight entity-framework linq-to-entities prism wcf-ria-services

我正在关注Silverlight和Prism上的tutorial,其中 WCF RIA服务用于通过 ADO访问 Northwind数据库。 NET实体数据模型

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

Picture of Data Model

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

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给出了一个Null Exception,因为Product和Order都为null。我已将我的EntityDataModel设置为“在模型中包含外键列”。代码与教程完全一样,我只需要重新创建ADO.Net EntityDataModel和DomainService以使用我的本地数据库,因此错误可能就在那里。

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

2 个答案:

答案 0 :(得分:1)

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

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

在域上下文加载中。

答案 1 :(得分: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; }


    }
}

this website详细介绍了这一点,感谢Brian Noyes向我指出。