WCF数据服务客户端上的部分类属性导致SaveContext异常

时间:2011-03-04 22:30:46

标签: silverlight-4.0 wcf-data-services

我正在运行一个正在公开EDM的WCF数据服务。我需要在客户端有几个属性,数据库不需要知道。设置完所有后,我得测试SaveContext方法,并在服务器上获取此错误“错误处理请求流。为类型'DataModels.Customer'指定的属性名'CanDelete'无效。”

有没有办法告诉客户端的WCF数据服务忽略此属性?或者我应该转向RIA Serivces?我已经读过将属性设置为internal将执行此操作,但我需要绑定属性,并且我在不同的项目中使用客户端UI代码(将我的SL应用程序与数据服务分离)。

在我的客户端上:

 public partial class Customer
{
  private bool canDelete;

        /// <summary>
        /// Gets or sets a value indicating whether this instance can be deleted.
        /// </summary>
        /// <value>
        ///     <c>true</c> if this instance can delete; otherwise, <c>false</c>.
private bool canDelete;

/// <summary>
/// Gets or sets a value indicating whether this instance can be deleted.
/// </summary>
/// <value>
///     <c>true</c> if this instance can delete; otherwise, <c>false</c>.
/// </value>
public bool CanDelete
{
    get
    {
        return this.canDelete;
    }

    set
    {
        if (this.canDelete != value)
        {
            this.canDelete = value;
            this.OnPropertyChanged("CanDelete");
        }
    }
}
}

1 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题,并在下面修改了一些代码 extending partial designer classes

它只是将ContextEntity事件挂钩在Context的部分类中。

我添加了自己的属性(IgnorePropertyAttribute),因此我可以将其附加到其他属性。

如果属性没有插入到第一位但这对我有用

当然会很好
public sealed class IgnorePropertyAttribute : Attribute
{
}

...

    partial void OnContextCreated()
    {
        this.WritingEntity += MyDataContext_WritingEntity;
    }

    private void MyDataContext_WritingEntity(object sender, System.Data.Services.Client.ReadingWritingEntityEventArgs e)
    {
        //
        foreach (XElement node in e.Data.Elements())
        {
            if (node != null && node.Name.LocalName == "content")
            {
                foreach (XElement el in node.Elements())
                {
                    if (el.Name.LocalName == "properties")
                    {
                        foreach (XElement prop in el.Elements())
                        {
                            if(e.Entity.GetType().GetProperty(prop.Name.LocalName).GetCustomAttributes(typeof(IgnorePropertyAttribute), true).Length > 0)
                            {
                                prop.Remove();
                            }
                        }
                    }
                }
            }
        }
    }