【问题标题】:Ignore non entity property when save projection changes in WCF Data Services在 WCF 数据服务中保存投影更改时忽略非实体属性
【发布时间】:2012-07-20 13:50:36
【问题描述】:

为了减少来自 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 中遇到异常:

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

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

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

客户端是 Silverlight 应用,WCF Data Services v5.0.1,oData v3

【问题讨论】:

    标签: entity-framework wcf-data-services odata


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      之前的解决方法(使用事件处理程序处理 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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多