Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net DataServiceContext更新错误_.net_Odata_Wcf Data Services_Wcf Data Services Client - Fatal编程技术网

.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调用之前设置所需字段的值

请求URL需要有
$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]是什么意思。此外,在保存更改之前设置了所需的值..尝试了此建议(并编辑了我的问题以反映代码更改),但得到了相同的结果。