我有以下带注释的模型
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的任何链接信息(这是我猜测验证在服务中失败的原因)。我是否遗漏了有关更新数据服务的内容?
答案 0 :(得分:1)
我相信正在发生的事情是OData使用的MERGE动词比PUT更有效(PUT需要发送所有字段,而MERGE只发送已更改的数据),但在您的模型字段中,“B”被标记为必需,因此您获得了客户端验证异常。要测试是这种情况,您可以暂时从“B”字段中删除[Required]属性,并检查更新操作是否成功。如果是这样,您有两种选择:
答案 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