WCF RIA EntityQuery ส่งคืนค่า null สำหรับ Foreign Keys

ฉันกำลังติดตาม บทช่วยสอน บน Silverlight และ Prism โดยที่ บริการ WCF RIA ใช้เพื่อเข้าถึง ฐานข้อมูล Northwind ผ่าน ข้อมูลเอนทิตี ADO.NET รุ่น.

ในฐานข้อมูล 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 กับฐานข้อมูล Northwind ที่ดัดแปลงสำหรับปี 2012 ในขณะที่บทช่วยสอนเขียนด้วย SQL Server 2008 RC


comment
คุณอาจใช้ Fiddler2 เพื่อดูคำขอ http และการตอบกลับได้   -  person Rik van den Berg    schedule 29.07.2012


คำตอบ (2)


คุณอาจต้องระบุผลิตภัณฑ์ / คำสั่งซื้ออย่างชัดเจนในวิธีการโหลด ลองทำก

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

ภายในการโหลดบริบทของโดเมน

person Josh    schedule 26.07.2012
comment
ฉันลองสิ่งนี้แล้ว แต่ก็ไม่ได้สร้างความแตกต่าง public IQueryable<Order_Detail> GetOrder_Details() { return this.ObjectContext.Order_Details.Include("Order").Include("Product"); } - person Phasma; 26.07.2012

นี่คือสิ่งที่ฉันต้องทำเพื่อแก้ไขปัญหา คำตอบของ 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 ที่ชี้ให้ผมเห็น

person Phasma    schedule 31.07.2012