.net DataServiceContext更新错误
我有以下带注释的模型.net DataServiceContext更新错误,.net,odata,wcf-data-services,wcf-data-services-client,.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 str
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的链接信息(我猜这是验证在服务中失败的原因)。我是否遗漏了一些关于更新数据服务的信息?我相信发生的事情是OData使用了比PUT更高效的合并谓词(PUT需要发送所有字段,而MERGE只发送更改的数据),但在您的模型中,字段“B”被标记为必需,因此您在客户端会收到一个验证异常。要测试这种情况,您可以暂时从“B”字段中删除[Required]属性,并检查更新操作是否成功。如果是,您有两个选择:
- 在客户端从您的模型中删除[必需]属性以使合并生效李>
- 确保在SaveChanges调用之前设置所需字段的值
$expand=B
,这样它还可以读取.B
属性值,这有助于后面的合并
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
删除该属性肯定会使更新成功。但是,数据服务中出现了验证异常,因此我不确定是否理解您所说的“从客户端的模型中删除[required]是什么意思。此外,在保存更改之前设置了所需的值..尝试了此建议(并编辑了我的问题以反映代码更改),但得到了相同的结果。