WCF Linq2SQL не возвращает «родительские» объекты - PullRequest
1 голос
/ 22 июня 2010

У меня есть служба WCF, которая извлекает данные через Linq2SQL.Я получаю все дочерние записи, только не связанные родительские записи

, т.е. запись клиента имеет связанные заказы, и у клиента есть статус.Я получаю клиентов и заказы, но не могу получить запись статуса, чтобы получить описание статуса

 using (MyDataContext context = new MyDataContext(CommonCode.DBConnectionString))
        {
            context.DeferredLoadingEnabled = false;
            DataLoadOptions options = new DataLoadOptions();
            options.LoadWith<Customer>(u => u.Orders);
            options.LoadWith<Customer>(u => u.CustomerStatus);

            context.LoadOptions = options; 
            context.ObjectTrackingEnabled = false; // retrieving data read only

            return context.Customers.SingleOrDefault<Customer>(
                cus=> cus.CustomerId == passedId );
        }

Я попытался поиграть с отложенной загрузкой и отслеживанием объектов (которые мне не нужны) иу нас заканчиваются идеи.

Может кто-нибудь помочь, как я могу вернуть запись статуса клиента, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 24 июня 2010

Я узнал, что это было! Linq to SQL поместит атрибут [DataMember ()] в дочерние записи, но НЕ в родительские записи. Мне пришлось добавить атрибут [DataMember ()] под ассоциацией.

Обратной стороной является то, что это ручной ввод в context.designer.cs, который будет перезаписан при изменении dbml: - (

    [Association(Name="CustomerStatus_Customer", Storage="_CustomerStatus", ThisKey="CustomerStatusId", OtherKey="CustomerStatusId", IsForeignKey=true)]
    [DataMember()]
    public CustomerStatus CustomerStatus
    {
        get
        {
            return this._CustomerStatus.Entity;
        }
        set
        { 
          ...
         }
     }
0 голосов
/ 22 июня 2010

Это на самом деле не отвечает на вопрос (досадно, я знаю!), Но, возможно, лучше определить пользовательские объекты в ваших контрактах данных и заполнить их вручную для передачи через службу. Таким образом, если вы измените модель Linq2Sql, вы не сломаете свой клиент WCF.

Кроме того, это не так долго, как кажется. В Linq2SQL вы можете что-то вроде ..

from c in context.Customers
where (...)
select new CustomerStatusRecord() { CustomerId = c.Id, Status = c.CustomerStatus.Status ... }

CustomerId и Status - это поля в вашем только что определенном контракте на данные.

Этот метод разъединения был бы моим предпочтительным способом сделать это, но я понимаю, почему для удобства проще передать весь объект контекста данных через сервис.

Последняя мысль: если в будущем вы добавите 50 нечетных новых полей в таблицу клиентов, то, как вы описали, действительно увеличит передачу данных через ваш сервис. Однако, если он не связан, у вас есть абсолютный контроль над тем, что происходит по проводам. Если вы оставите все как есть, возможно, в конечном итоге вы передадите конфиденциальные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...