1

PKにGuidを使用するSQLデータベースがあり、挿入するとNewId()が生成されます。DBにキーを管理させ、コードにPKプロパティを設定させないため、エンティティキー:true、Setter:private、およびStoreGeneratedPattern:Identityを使用してプライマリキーを設定して、そのデータベースを指すEFデータコンテキストを設定しています。

このデータにアクセスするためのOData(System.Web.Data.Services.DataService)エンドポイントがあります(Hanselmanが行ったように) 。

このサービスへのサービス参照を持つ別のアプリがあります。この参照(つまりProduct)から新しいオブジェクトを作成しようとすると、ProductId主キーはデフォルトでGuid.Emptyに設定されます。

var serviceEntities = new ServiceEntities(serviceUri); //OData endpoint

var product = new Product();
product.Name = "New Product";

serviceEntities.AddToProducts(product);
serviceEntities.SaveChanges(); // error happens here

デバッグするとき、Product.ProductIdプロパティを確認し、Guid.Emptyに設定します。SaveChangesを呼び出すときに、ProductIdフィールドをサービスに送信したくありません。私が得る応答は次のとおりです。

リクエストストリームの処理中にエラーが発生しました。プロパティ'ProductId'は読み取り専用のプロパティであり、更新できません。このプロパティがリクエストペイロードに存在しないことを確認してください。

これを行う方法はありますか、またはこのセットアップを正しく取得し、DBにキーを生成させるために何ができますか?

上記の製品例と同じ設定です。 代替テキスト

4

1 に答える 1

0

私がやったのは、を追加することでしたChangeInterceptor。これは機能しますが、それを行うための好ましい方法ではありません。

[ChangeInterceptor("Products")]
public void OnChangeApplications(Product product, UpdateOperations operations)
{
    if (operations != UpdateOperations.Add) return;

    if (product.ProductId == Guid.Empty)
    {
        product.ProductId = Guid.NewGuid();
    }
}
于 2010-05-14T14:59:03.757 に答える