1

为了减少来自 WCF 数据服务的数据量,我使用了投影技术。

Linq 查询看起来像:

...
    _ctx.Files.Select(x => new FileProjection() { Id=x.Id, Name = x.Name });
...

[DataServiceKey("Id")]
public class FileProjection : ViewModelBase
{
    private string _name;

    public Guid Id { get; set; }
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            NotifyOfPropertyChange(() => Name);
        }
    }

    public string MyCustomProperty { get; set; }
}

FileProjection 类具有 File 实体模型中不存在的附加属性。

它在获取数据时工作正常。但是,如果我尝试更新名称,我会在 SaveChanges 中遇到异常:

附加信息:“DataAccessLayer.Context.File”类型上不存在“MyCustomProperty”属性。确保仅使用类型定义的属性名称。

有没有办法在 SaveChanges 期间忽略 MyCustomProperty?

或者 XXXProjection 类不应该有任何自定义公共属性?

客户端是 Silverlight 应用程序、WCF 数据服务 v5.0.1、oData v3

4

3 回答 3

3

目前,这样做的唯一方法是将属性设为内部或私有。所有公共属性都将被序列化,如果服务器无法识别它,它将失败。

或者您可以使用 Phani 的解决方法:http: //blogs.msdn.com/b/phaniraj/archive/2008/12/11/customizing-serialization-of-entities-in-the-ado-net-data-services -client-library.aspx

于 2012-07-20T15:15:32.450 回答
0

以前的解决方法(使用事件的事件处理程序DataServiceContext.WritingEntity)的这个问题是它只适用于 Atom - 它不适用于 JSON。

WCF 数据服务客户端和 OData 客户端的新版本现在支持一些管道事件拦截,它适用于 JSON 和 ATOM。更多信息在这里:

http://blogs.msdn.com/b/odatateam/archive/2013/07/26/using-the-new-client-hooks-in-wcf-data-services-client.aspx

于 2014-09-19T07:26:20.290 回答
0

如果 private 或 internal 对你不起作用,在我的情况下,你可以简单地使用方法来代替。

public string GetName()
public void SetName(string value)

这些方法将忽略序列化,您可以跨类库维护状态。

于 2014-10-19T18:09:26.453 回答