0

MVVMを使用してWindowsPhoneデータベースの例を自分のアプリに適合させています。ここでは、 (メソッドを使用して)を使用EntitySetして割り当てを可能にするゲッター/セッターの組み合わせでモデルオブジェクトのプロパティをラップすることを提案しています。IEnumerableAssign

// Example method from a model class 'SomeModelObject'
[Association(Storage = "_todos", OtherKey = "_categoryId", ThisKey = "Id")]
public EntitySet<ToDoItem> ToDos
{
    get { return this._todos; }
    set { this._todos.Assign(value); }
}

EntitySetただし、プロパティを持つオブジェクトをインスタンス化しようとすると、それは許可されません。

SomeModelObject myModelObject = new SomeModelObject() {
    Property1 = "foo",
    Property2 = true,
    // Following raises an error, even though setter should allow assignment
    // from an IEnumerable (because of the use of 'Assign' in the setter)
    ToDos = new List<ToDoItem>() {
        new ToDoItem(),
    },
};

エラーは次のとおりです。

Error    1   Cannot implicitly convert type 
'System.Collections.Generic.List<SomeApp.ToDoItem>' to 
'System.Data.Linq.EntitySet<SomeApp.ToDoItem>'

から参照されるオブジェクトをインスタンス化するにはどうすればよいEntitySetですか?

4

1 に答える 1

3

さて、あなたが投稿したコードには2つの問題があります。

主な問題は、プロパティのタイプがであるときに、プロパティの値をに設定しようとしていることだと思います。(投稿したエラーメッセージは投稿したコードと一致しませんが、気にしないでください。)「からの割り当てを許可する必要がありますが、なぜそうなると予想するのかわかりません。 、プロパティの宣言が与えられた場合:List<ToDoItem>EntitySet<ToDoItem>IEnumerable

public EntitySet<ToDoItem> ToDos { ... }

プロパティはタイプではありませんIEnumerable<ToDoItem>

またnew SomeModelObject、何らかの理由で2回使用しています。

SomeModelObject myModelObject = new SomeModelObject() {
    new SomeModelObject() {
        Property1 = "foo",
        ...
    }
};

実際のコードは次のようになっていると思います。

SomeModelObject myModelObject = new SomeModelObject() {
  Property1 = "foo",
  ... 
};

今後はもっと注意してください。投稿されていないコードを診断するのは非常に困難です。

の周りには3つのオプションがありますEntitySet

既存の アイテムに新しいアイテムを追加するEntitySet<ToDoItem>場合は、オブジェクト初期化子内でそれを行うことができます。

SomeModelObject myModelObject = new SomeModelObject {
  Property1 = "foo",
  Property2 = true,
  ToDos = {
    new ToDoItem(),
  }
};

EntitySet<ToDoItem>または、プロパティ自体の値を設定する場合は、新しい:を作成する必要があります。

SomeModelObject myModelObject = new SomeModelObject {
  Property1 = "foo",
  Property2 = true,
  ToDos = new EntitySet<ToDoItem> {
    new ToDoItem(),
  }
};

ただし、これは良い考えではないようです。実際には、セッターをプライベートにすることをお勧めします。

または、本当にいずれかを割り当てられるようにしたい場合IEnumerable<ToDoItem>は、プロパティのタイプを変更するだけです。

[Association(Storage = "_todos", OtherKey = "_categoryId", ThisKey = "Id")]
public IEnumerable<ToDoItem> ToDos
{
    get { return this._todos; }
    set { this._todos.Assign(value); }
}
于 2012-10-27T18:47:46.220 に答える