0

我正在使用带有自定义实体类的 WCF Data Services 5.6,并成功地将数据读入从Catel 的 ModelBase继承的实体中。但是,当我尝试执行插入或更新时,数据服务使用的反射在 ModelBase 的只读属性之一“ValidationContext”上失败,该属性实现了一个没有设置器的接口。ValidationContext 具有在 Catel 中定义的 [XmlIgnore] 和 [Browsable(false)] 属性。

我尝试删除Configurations.RequestPipeline.OnEntryStarting 和 OnEntryEnding 钩子中的属性,也尝试通过在 WritingEntry 事件中编辑 xml的(旧学校)方法。但是在任何这些事件被触发之前就会出现以下异常。

因此,看起来数据服务客户端在尝试序列化之前正在反映类型,并在那里吐出错误,因为它无法将 IValidationContext 解释为模型中的有效实体类型。

我成功测试的一种解决方法是用非公共版本有效地替换公共 ModelBase 属性:

internal new IValidationContext ValidationContext 
{ 
   get { return base.ValidationContext; } 
}

但这显然是不可接受的,因为那样我就不能在其他地方使用 ValidationContext 了。

我相信如果您要在任何实体的对应部分类代码中添加类似这样的任何属性,那么通过“添加服务引用”生成的代理也会出现问题。

有什么建议吗?我们可以替换/覆盖任何相关的序列化器方法吗?


“Catel.Data.IValidationContext”类型没有可设置的属性。来源: Microsoft.Data.Services.Client at System.Data.Services.Client.ClientEdmModel.GetOrCreateEdmType(Type type) at System.Data.Services.Client.Metadata.ClientTypeUtil.TypeIsEntity(Type t, ClientEdmModel model) at System.Data .Services.Client.ODataPropertyConverter.TryConvertPropertyValue(ClientPropertyAnnotation 属性,对象 propertyValue,HashSet1 visitedComplexTypeObjects, ODataValue& odataValue) at System.Data.Services.Client.ODataPropertyConverter.PopulateProperties(Object resource, String serverTypeName, IEnumerableSystem.Data.Services.Client.BaseSaveResult.CreateRequestData(EntityDescriptor entityDescriptor, ODataRequestMessageWrapper requestMessage) 处 System.Data.Services.Client.BaseSaveResult.CreateRequestData(EntityDescriptor entityDescriptor, ODataRequestMessageWrapper requestMessage) 处的 1 个属性) .Services.Client.BaseSaveResult.CreateChangeData(Int32 index, ODataRequestMessageWrapper requestMessage) 在 System.Data.Services.Client.BatchSaveResult.BatchRequest()在 System.Data.Services.Client.BatchSaveResult.BatchRequest()
在 System.Data.Services.Client.BatchSaveResult.GenerateBatchRequest() 在 System.Data.Services。 System.Data.Services.Client.DataServiceContext.SaveChanges() 处的 Client.DataServiceContext.SaveChanges(SaveChangesOptions 选项)

4

0 回答 0