【问题标题】:WCF RIA EntityQuery returns null for Foreign KeysWCF RIA EntityQuery 为外键返回 null
【发布时间】:2012-07-26 14:18:08
【问题描述】:

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

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

查询数据库的代码如下:

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

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

【问题讨论】:

  • 您或许可以使用 Fiddler2 查看 http 请求和响应。

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


【解决方案1】:

您可能需要在加载方法中明确包含产品/订单。尝试做一个

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

在域上下文加载。

【讨论】:

  • 我试过这个,但没有任何区别。 public IQueryable&lt;Order_Detail&gt; GetOrder_Details() { return this.ObjectContext.Order_Details.Include("Order").Include("Product"); }
【解决方案2】:

这是我为解决问题所必须做的。 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向我指出。

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多