Служба wcf не возвращает родительские и дочерние записи таблицы linq-to-sql? - PullRequest
1 голос
/ 06 октября 2011

Я пишу службу wcf, используя linq to sql datacontext для выполнения операций с базой данных.

Имея записи о клиентах и ​​заказах, один метод должен возвращать конкретного клиента по идентификатору, например:

public customer Customer_Get_By_Session_Id(string session_id) {

        //check valid session_id
        //...

        //if session_id exists, get customer info
        var saved_customer = (from p in db.customers
                              where p.session_id == session_id
                              select p).FirstOrDefault();

        return saved_customer;
    }

Однако при вызове из моего метода тестирования он возвращает только одного клиента без каких-либо заказов.

 [TestMethod]
    public void CustomerGetByid()
    {

        dataclassesDataContext db = new dataclassesDataContext();
        var mycust =  db.partner_svc_customers.FirstOrDefault();

        var saved_customer = svc_wcf.Customer_Get_By_Session_Id(mycust.session_id);

        //fails! saved_customer.orders.Count() == 0
        Assert.IsTrue(saved_customer.orders.Count() == 1);


    }

Я могу обойти эту проблему, изменив мой метод так, чтобы вручную добавлять заказы другому клиенту return_customer и возвращать этот объект.

public customer Customer_Get_By_Session_Id(string session_id) {

        //check valid session_id
        //...

        //if session_id exists, get customer info
        var saved_customer = (from p in db.customers
                              where p.session_id == session_id
                              select p).FirstOrDefault();


        var orders = saved_customer.orders.ToList();

        customer return_customer = new customer();
        return_customer = saved_customer;

        foreach (order my_order in orders)
        {
            returned_customer.orders.Add(my_order);
        }
        return returned_customer;
    }

Теперь тест завершается без ошибки.

Мой вопрос: почему? Чего здесь не хватает? Разве объект клиента не должен быть отправлен со всеми заказами без изменений, как я и ожидал?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 06 октября 2011

Из памяти это часть отложенной загрузки.Если данные еще не были загружены, то не будет загружать их просто с целью сериализации (они используют обратные вызовы сериализации, чтобы узнать, сериализуются ли они).Если вы хотите заставить это сделать, просто выполните итерации.На самом деле, я подозреваю, вы обнаружите, что простое добавление этой строки:

var orders = saved_customer.orders.ToList(); 

- это то, что заставляет его работать, так как это заставляет его загружать данные, то есть

var saved_customer = (from p in db.customers
                      where p.session_id == session_id
                      select p).FirstOrDefault();

var orders = saved_customer.orders.ToList(); // voodoo to make orders load
return saved_customer;
...