【问题标题】:DataServiceContext Update ErrorDataServiceContext 更新错误
【发布时间】:2014-12-10 23:33:38
【问题描述】:

我有以下带注释的模型

public class TypeA
{ 
    public int TypeAId { get; set;  }  

    [Required]
    public TypeB B { get; set; }         

    public string AValue { get; set; }
}


public class TypeB
{ 
    public int TypeBId { get; set; } 

    public string BValue { get; set; }
}

由使用实体框架的 WCF 数据服务公开为 v3 odata。当我尝试使用 DataServiceContext 更新 TypeA 时,例如

var ctx = new Service.Context(new Uri("http://localhost/TestUpdateService/TestUpdateService.svc"));
var t = ctx.theATypes.Expand(p => p.B).First();
t.AValue = "New value";
ctx.UpdateObject(t);
ctx.SaveChanges();

我在服务中收到一个 DbEntityValidationException,说明“B 字段是必需的”

请求正文“MERGE /TestUpdateService/TestUpdateService.svc/theATypes(1) HTTP/1.1” 包含 AValue 属性更改,但不包含到属性 B 的任何链接信息(这是我对服务中验证失败的原因的猜测)。我是否遗漏了有关更新数据服务的内容?

【问题讨论】:

    标签: .net odata wcf-data-services wcf-data-services-client


    【解决方案1】:

    我相信发生的事情是 OData 使用比 PUT 更有效的 MERGE 动词(PUT 需要发送所有字段,而 MERGE 只发送更改的数据),但是在您的模型字段中,“B”被标记为必需,所以你得到一个客户端验证异常。要测试是否是这种情况,您可以暂时从“B”字段中删除 [Required] 属性并检查更新操作是否成功。如果是这样,您有两种选择:

    • 在客户端从您的模型中删除 [必需] 属性以启用 MERGE;
    • 确保在调用 SaveChanges 之前设置必填字段的值。

    【讨论】:

    • 删除属性当然可以让更新成功。但是验证异常发生在数据服务中,所以我不确定我是否理解“从客户端的模型中删除 [必需] 的意思。此外,所需的值是在保存更改之前设置的..跨度>
    【解决方案2】:

    请求 URL 需要有$expand=B,这样它也可以读取.B 属性值,这有助于跟随 MERGE。

    var ctx = new Service.Context(new Uri("http:// localhost /TestUpdateService/TestUpdateService.svc"));
    
    //var t = ctx.theATypes.First();
    
    var t=
    
    (
    
    from s in ctx.theATypes 
    
    select new TypeA(){AValue =s.AValue , B=s.B} 
    
    )
    .First();
    
    t.AValue = "New value";
    
    ctx.UpdateObject(t);
    
    ctx.SaveChanges
    

    【讨论】:

    • 尝试了这个建议(并编辑了我的问题以反映代码更改),但得到了相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2012-09-21
    • 2013-10-07
    • 2018-05-13
    • 2015-07-09
    相关资源
    最近更新 更多