【问题标题】:Error when sending an Linq-to-Sql object to the server using WCF使用 WCF 将 Linq-to-Sql 对象发送到服务器时出错
【发布时间】:2010-12-27 00:26:08
【问题描述】:

我正在尝试开发一个具有 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-我什至无法调试它,错误发生在我的方法被调用之前,可能是在解组请求时。

这样的事情会发生什么?我在哪里可以看看?会不会是配置问题?

谢谢你, 奥斯卡

编辑:找到这个链接Serializing Linq2Sql over Wcf - bug or misunderstanding?,他们告诉这是一个错误,但它是一年前的。有谁知道解决了吗?

【问题讨论】:

    标签: silverlight wcf web-services linq-to-sql windows-phone-7


    【解决方案1】:

    所以基本上这里发生的是客户端正在发送一个物化对象图。 Task 对象有一个Severity 属性和一个对应的SeverityID 属性。当服务器反序列化客户端的请求时,它会创建一个Task 对象,然后可能首先反序列化Severity 属性。现在,当 SeverityID 被反序列化时,LINQ to SQL 的限制正在受到打击......

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

    如果相关对象的属性 (Severity) 已设置,则无法设置外键属性 (SeverityID)。

    我怀疑这就是为什么 LINQ to SQL 将其序列化模式称为“单向”的原因,因为将物化集合传回会导致此类问题。

    不要在客户端上设置Severity 属性,而是尝试设置SeverityID 属性。您也可以尝试在服务器上禁用延迟加载,但我不知道这是否会产生任何影响。

    【讨论】:

    • 您好,感谢您的回答!我已经尝试设置 SeverityID,但没有帮助。我会尝试禁用延迟加载并尽快回复您!
    • 嗨,试过了,但确实没有帮助。它现在可以工作,因为我更改了自动生成的代码,虽然这是一个非常糟糕的做法......
    • 嗯,我刚刚检查了一下,LINQ to SQL 设计器生成的代码包括类的所有标量属性的 DataMember 序列化属性,但不包括关联属性。您确定将序列化模式设置为“单向”吗?否则,在您的示例中,我没有看到 Severity 属性会被反序列化。只有 SeverityID 属性。
    • 你成功了! “单向”不见了!这么小,花了我好几个小时!非常感谢您的帮助!
    猜你喜欢
    • 2012-01-26
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多