0

Azureテーブルストレージを使用していますが、エンティティのnullとデフォルト値がどのように機能するかについて質問があります。

具体的には、を拡張するクラスがありますTableServiceEntity。このクラスのデフォルトコンストラクタは、次のようなさまざまなプロパティのデフォルト値を設定しています。

public class MyEntity: TableServiceEntry
{
    public MyEntity() : MyEntity("invalid", "invalid") {}
    public MyEntity(string f1, string f2) 
    {
        Field1 = f1;
        Field2 = f2;
    }

    public string Field1 { get; set; }
    public string Field2 { get; set; }
 }

次のエンティティを作成して、このクラスをローカルで(エミュレーターで)テストしました。

MyEntity e = new MyEntity("hello", null);

エンティティをアップロードしてからローカルで取得すると、予想どおり、2つのフィールドがそれぞれ「hello」とnullに設定されました。

ただし、同じエンティティをAzureクラウドにアップロードしたときに返されるのは、2つのプロパティでそれぞれ「hello」と「invalid」でした。

エンティティを保存する私のコードは以下のとおりです。

public class MyTable : TableServiceContext
{
    ...
    public void AddEntry(MyEntity e)
    {
        this.AddObject("MyTable", e);
        this.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
    }
}

デフォルトのコンストラクターに引数をとらせないことでこれを修正することができましたが、テーブルストレージがどのように機能するかについて根本的な誤解を持っているように感じます。TableServiceEntryのプロパティにデフォルトを指定すると、それらがクラウド内のテーブルの各行のデフォルトになりますが、エミュレーター(つまり、クラウドとSQL Express)ではデフォルトになりませんか?もしそうなら、なぜ私はそれらのデフォルトをnullクラウドでオーバーライドできないのですか?nullAzureテーブルストレージでデフォルトのコンストラクターとがどのように機能するかを説明するドキュメントはありますか?

4

2 に答える 2

1

はい、エミュレーターとクラウドでのテーブルストレージの動作には違いがあります。SQL Serverに実装されたエミュレーターは、列の値(null /非null)に関係なく、行に定義されていない場合でも、テーブルに定義されているすべての列を返します。クラウドでは、nullに設定されたプロパティは、REST呼び出しに保存も返されません。

簡単な修正は、プロパティセットでnullをチェックし、渡された値がnullでない場合にのみプロパティを変更することです。

于 2012-08-09T18:44:15.457 に答える
0

Devstorageと実ストレージの動作が異なる場合もありますが、NULL値の処理が異なることはありません。そして、あなたが示唆しているように、それが値をNULLから「無効」に変更するのを見たことがありません。誤って間違った値をクラウドにアップロードしていませんか?もう一度やり直して、Fiddlerを使用して実際のリクエストとレスポンスの値を確認することをお勧めします。

于 2012-08-09T19:24:30.590 に答える