我正在使用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事件?
是否有另一种方法可以防止部分类的扩展属性被序列化?
由于
答案 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);
}
}));
}