0

我正在使用 WCF 数据服务(现在为 5.6),并且由于不支持枚举(以及出于其他原因),我有一些附加属性添加到客户端类中,我打算在 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 事件?

是否有另一种方法可以防止部分类的扩展属性被序列化?

谢谢

4

1 回答 1

0

这似乎是由于在客户端部分类上使用公共枚举引起的。一旦我将枚举的访问修饰符更改为内部,问题就消失了。

在这个过程中,我学会了一种更好的方法来控制哪些属性被序列化,方法是挂钩 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);
        }
    }));
}
于 2014-03-26T09:41:42.587 回答