WCF数据服务SaveChanges没有触发WritingEntity事件

时间:2014-03-24 12:27:35

标签: c# .net wcf-data-services wcf-data-services-client

我正在使用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 个答案:

答案 0 :(得分: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);
        }
    }));
}