Службы данных 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);
}
}));
}