1

我有以下带注释的模型

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 的任何链接信息(这是我对验证原因的猜测服务失败)。我是否缺少有关更新数据服务的信息?

4

2 回答 2

1

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

  • 从客户端的模型中删除 [Required] 属性以启用 MERGE 工作;
  • 确保在调用 SaveChanges 之前设置必填字段的值。
于 2014-12-15T10:37:56.830 回答
0

请求 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
于 2015-01-05T03:16:53.130 回答