Службы данных WCF SaveChanges не запускают событие WritingEntity

Я использую службы данных WCF (сейчас 5.6), и поскольку Enums не поддерживаются (и по другим причинам), у меня есть некоторые дополнительные свойства, добавленные к классам на стороне клиента, которые я собираюсь удалить во время SaveChanges, используя событие WritingEntity, следуя примеру в http://blogs.msdn.com/b/phaniraj/archive/2008/12/11/customizing-serialization-of-entities-in-the-ado-net-data-services-client-library.aspx

Мой конструктор присоединяет событие, но я нахожу, что иногда оно срабатывает, а иногда (чаще) - нет.

public MyDataContext(System.Uri serviceRoot, bool ignoreProperties)
    : this(serviceRoot)
{
    if (ignoreProperties)
        this.WritingEntity += EdiContext_WritingEntity;
    this.SendingRequest2+=OnSendingRequest;
}

Сохранить изменения

db.AttachTo("Maps", map, "*");
db.UpdateObject(map);
ProcessMapCoordinates(db, map);
ProcessModifiers(map, db);
db.SaveChanges();

Событие SendingRequest2 происходит, я использую его, чтобы прикрепить некоторую информацию заголовка к запросу для поддержки нескольких данных.

private void OnSendingRequest(object sender, SendingRequest2EventArgs e)
{
    e.RequestMessage.SetHeader("profile", ClientSettings.Instance.Profile);
}

Кто-нибудь знает, при каких обстоятельствах событие WritingEntity не сработает?

Есть ли другой способ предотвратить сериализацию расширенных свойств из частичного класса?

Спасибо

1 ответ

Решение

Похоже, это было вызвано использованием открытых Enums на частичном классе на стороне клиента. Как только я изменил модификатор доступа enum на внутреннюю, проблема ушла.

В процессе я узнал еще лучший способ управления тем, какие свойства сериализуются, подключившись к событиям RequestPipeline:

if (ignoreProperties)
{
    this.Configurations.RequestPipeline.OnEntryStarting((a =>
    {
        entityType = Type.GetType(a.Entry.TypeName);
        if (entityType != null)
        {
            var props =
                entityType.GetProperties()
                    .Where(
                        property =>
                            property.GetCustomAttributes(typeof (DoNotSerializeAttribute), false).Length > 0)
                    .Select(p => p.Name)
                    .ToArray();
            a.Entry.RemoveProperties(props);
        }
    }));
}
Другие вопросы по тегам