Сериализация в WCF / LINQ to SQL - PullRequest
2 голосов
/ 02 июня 2009

Я создал свой dbml-файл с нужными мне таблицами. Один из сгенерированных методов как таковой, имена были изменены, и это не является синтаксически правильным. Но мой код компилируется с созданным оригинальным методом.

[Association(Name="Clients_ToEmployee", Storage="_ToEmployees", ThisKey="ClientID", OtherKey="ClientID")]
[DataMember(Order=70, EmitDefaultValue=false)]
public EntitySet<ClientToEmployee> ClientToEmployees
{
    get
    {
        if ((this.serializing &&(this._ToEmployees.HasLoadedOrAssignedValues == false)))
        {
            return null;
        }
        return this._ToEmployees;
    }
    set
    {
        this._ToEmployees.Assign(value);
    }
}

Когда я пытаюсь сериализовать свой набор результатов, используя

 DataContractSerializer ser =
                new DataContractSerializer(clientObj.GetType());
var memStream = new System.IO.MemoryStream();
ser.WriteObject(memStream ,clientObj);
memStream .Seek(0, System.IO.SeekOrigin.Begin);
var streamReader = new System.IO.StreamReader(memStream );
var xml = streamReader.ReadToEnd();

Похоже на этот код, см. Ниже, он всегда возвращает ноль

if ((this.serializing && (this._ToEmployees.HasLoadedOrAssignedValues == false)))

Если я установлю точку останова и пройдусь по коду, то приведенное выше утверждение

this._ToEmployees.HasLoadedOrAssignedValues

- истина, и я получаю свой объект, а не ноль.

Почему он ведет себя правильно, когда я прохожу код? Должен ли я ввести задержку для заполнения объекта Entityset?

Ответы [ 3 ]

2 голосов
/ 16 июля 2009

У меня была такая же проблема в моей службе WCF. В моем случае это был тот факт, что во время отладки у Linq было достаточно времени, чтобы лениво загрузить дочерние записи. Когда не в режиме отладки, он просто возвращал родительские записи. Большинство моих методов были хорошими, но у одного было много родительских записей с большим количеством дочерних записей, и ни одна из дочерних записей не сделала это. Поэтому я поместил этот код в мой метод WCF:

DataLoadOptions dlOptions = new DataLoadOptions();
dlOptions.LoadWith<ParentTable>(Parent => Parent.Child);
dc.LoadOptions = dlOptions;
0 голосов
/ 05 сентября 2009
DataLoadOptions dlOptions = new DataLoadOptions();
dlOptions.LoadWith<ParentTable>(Parent => Parent.Child);
dc.LoadOptions = dlOptions;

Работает.

Я действительно трачу много времени, чтобы найти решение ... !!

0 голосов
/ 02 июня 2009

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

Я рекомендую вам упростить сценарий и попробуйте снова.

Я также не рекомендую возвращать объекты LINQ to SQL или LINQ to Entities из веб-службы. К сожалению, Microsoft решила включить зависимые от реализации данные в базовые классы, поэтому они не сериализуются чисто.

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