我正在关注Silverlight和Prism上的tutorial,其中 WCF RIA服务用于通过 ADO访问 Northwind数据库。 NET实体数据模型。
在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
给出了一个Null Exception,因为Product和Order都为null。我已将我的EntityDataModel设置为“在模型中包含外键列”。代码与教程完全一样,我只需要重新创建ADO.Net EntityDataModel和DomainService以使用我的本地数据库,因此错误可能就在那里。
我该如何调试此错误?我以前没有数据库经验。我正在使用SQL Server 2012和适用于2012的Northwind数据库,而本教程是使用SQL Server 2008 RC编写的。
答案 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向我指出。