1

ADO.NET Entity Data Modelを介してNorthwind データベースにアクセスするためにWCF RIA サービスを使用する、Silverlight と Prism に関するチュートリアルに従っています。

Northwind データベースには、外部キーを介して他の 2 つのテーブル (Orders と Products) に接続されている 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 OrderItemProduct と Order の両方が null であるため、これにより で Null Exceptionが発生します。EntityDataModel を「モデルに外部キー列を含める」に設定しました。コードはチュートリアルとまったく同じです。ローカル データベースで動作するように ADO.Net EntityDataModel と DomainService を再作成するだけでよかったので、エラーはおそらくそこのどこかにあります。

このエラーをどのようにデバッグしますか? データベースの経験はありません。チュートリアルはSQL Server 2008 RCで書かれていますが、2012年に適応したNorthwindデータベースでSQL Server 2012を使用しています。

4

2 に答える 2

1

問題を解決するために私がしなければならなかったことは次のとおりです。ジョシュの答えは解決策の一部でしたが、[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; }


    }
}

これについては、この Web サイトで詳しく説明されています。Brian Noyesが指摘してくれたことに感謝します。

于 2012-07-31T11:04:14.600 に答える
1

おそらく、load メソッドに Product / Order を明示的に含める必要があります。してみてください

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

ドメインコンテキストロード内。

于 2012-07-26T16:08:08.870 に答える