DataServiceContext更新错误

时间:2014-12-10 23:33:39

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

我有以下带注释的模型

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的任何链接信息(这是我猜测验证在服务中失败的原因)。我是否遗漏了有关更新数据服务的内容?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

请求网址需要$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