WCF Data Service Частичное свойство класса на клиенте вызывает исключения SaveContext - PullRequest
1 голос
/ 05 марта 2011

У меня работает служба данных WCF, которая выставляет EDM.Есть несколько свойств, которые мне нужны на стороне клиента, о которых база данных не должна знать.После настройки всего этого я приступил к тестированию метода SaveContext и получил эту ошибку на сервере «Ошибка обработки потока запросов. Имя свойства« CanDelete », указанное для типа« DataModels.Customer », недопустимо».

Есть ли способ указать WCF Data Services на стороне клиента игнорировать это свойство?Или я должен перейти в RIA Serivces?Я читал, что установка свойства для внутреннего будет делать это, но мне нужно свойство для привязки, и у меня есть код пользовательского интерфейса клиента в другом проекте (отсоединение моих приложений 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 Ответ

1 голос
/ 24 марта 2011

У меня была точно такая же проблема, и я адаптировал код ниже расширение частичных классов дизайнеров

Это просто включает в себя перехват события WritingEntity внутри частичного класса 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();
                            }
                        }
                    }
                }
            }
        }
    }
...