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();

サービスで「B フィールドが必要です」という DbEntityValidationException が発生します。

リクエストの本文「MERGE /TestUpdateService/TestUpdateService.svc/theATypes(1) HTTP/1.1」には、AValue プロパティの変更が含まれていますが、プロパティ B へのリンク情報は含まれていません (これは、検証が行われる理由についての私の推測です)。サービスに失敗します)。データ サービスの更新について何か不足していますか?

4

2 に答える 2

1

起こっていることは、OData が PUT よりも効率的な MERGE 動詞を使用していることだと思います (MERGE は変更されたデータのみを送信するのに対し、PUT はすべてのフィールドを送信する必要があります) が、モデル フィールドでは "B" が必須としてマークされているため、検証例外が発生しますクライアント側。これが事実であることをテストするには、「B」フィールドから [Required] 属性を一時的に削除し、更新操作が成功することを確認します。その場合、次の 2 つのオプションがあります。

  • クライアント側のモデルから [必須] 属性を削除して、MERGE が機能するようにします。
  • SaveChanges 呼び出しの前に、必須フィールドの値が設定されていることを確認してください。
于 2014-12-15T10:37:56.830 に答える
0

リクエスト URL には が必要です。これにより、MERGE をたどるのに役立つプロパティ値$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
于 2015-01-05T03:16:53.130 に答える