Ошибка при отправке объекта Linq-to-Sql на сервер с использованием WCF - PullRequest
2 голосов
/ 27 декабря 2010

Я пытаюсь разработать систему, которая имеет 2 уровня: мобильный клиент и сервер, который использует LINQ to SQL для хранения информации в базе данных.Я хочу создать сервер WCF, который будет хранить задачу на сервере, поэтому он получит задачу от клиента и будет использовать LINQ to SQL для ее хранения.

Чтобы сделать эту службу, я создал файл dbml.Таким образом, я могу использовать текст данных.

Это мой метод обслуживания:

public Task SaveTask(string token, Task task)
    {
        TrackingDataContext dataConext = new TrackingDataContext();


        //Saves/Updates the task
        dataConext.Tasks.InsertOnSubmit(task);
        dataConext.SubmitChanges();

        return task;
    }

токен будет использоваться в будущем

И это мой метод клиента,который вызовет службу:

private void btnSave_Click(object sender, EventArgs e)
    {
        //Populate the object with the info
        Task task = new Task();
        task.Title = tbTitle.Text;
        task.Description = tbDescription.Text;
        //this is a FK to another table
        task.Severity = ((Severity)lbSeverities.SelectedItem);
        //the first state: "open"
        task.StateID = 1;

        //Save the task
        client.SaveTaskCompleted += new EventHandler<SaveTaskCompletedEventArgs>(client_SaveTaskCompleted);
        client.SaveTaskAsync(App.Token, task);
    }

Как вы можете видеть, я создаю новый объект, заполняю его и отправляю его в мой сервис, который получит его и сохранит.Теоретически это будет работать нормально.

Клиент может создать объект и отправить его на сервер.Когда сервер получает запрос, он пытается построить объект снова, но затем я получаю исключение System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException в этом методе (создается автоматически из VS2010):

 [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_SeverityID", DbType="Int NOT NULL")]
        public int SeverityID
        {
            get
            {
                return this._SeverityID;
            }
            set
            {
                if ((this._SeverityID != value))
                {
                    if (this._Severity.HasLoadedOrAssignedValue)
                    {
                        throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
                    }
                    this.OnSeverityIDChanging(value);
                                    //The exception happens in this line                    
                                    this.SendPropertyChanging();
                    this._SeverityID = value;
                    this.SendPropertyChanged("SeverityID");
                    this.OnSeverityIDChanged();
                }
            }
        }

Не можетбыть любой ошибкой в ​​моем методе сервера, потому что: 1 - это очень просто и не имеет логики внутри 2 - я даже не могу отладить его, ошибка происходит до того, как мой метод вызывается, вероятно, при демонтаже запроса.

Что может случиться что-то подобное?Где я могу посмотреть?Может ли это быть проблемой конфигурации?

Спасибо, Оскар

Редактировать: нашел эту ссылку Сериализация Linq2Sql поверх Wcf - ошибка или недоразумение? , где говорят, что этоошибка, но это с 1 года назад.Кто-нибудь знает, было ли это решено?

1 Ответ

3 голосов
/ 27 декабря 2010

Итак, в основном здесь происходит то, что клиент отправляет материализованный граф объектов.Объект Task имеет свойство Severity и соответствующее свойство SeverityID.Когда сервер десериализует запрос клиента, он создает объект Task, а затем, вероятно, сначала десериализует свойство Severity.Теперь, когда SeverityID десериализуется, наступает ограничение LINQ to SQL ...

if (this._Severity.HasLoadedOrAssignedValue) {
    throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
}

Нельзя установить свойство внешнего ключа (SeverityID), если свойство связанного объекта (Severity) уже установлено.

Я подозреваю, что именно поэтому LINQ to SQL называет свой режим сериализации «однонаправленным», потому что возвращение материализованной коллекции назад приведет к такого рода проблеме.установки свойства Severity на клиенте, попробуйте вместо этого установить свойство SeverityID.Вы также можете попробовать отключить отложенную загрузку на сервере, но я не знаю, окажет ли это какое-либо влияние.

...