2009-03-26 21 views
3

私は、ペットのリストを含む「Person」クラスを使用して小さなサンプルを作成しました。さらに、Personオブジェクトを保存/削除/選択できる単純なリポジトリもあります。 私のフォームにフォームビュー(または詳細ビュー)を配置し、自分のリポジトリを指すオブジェクトデータソースを選択します。これまでのところ完全に動作し、人を作成、更新、削除することができます...自分のビューのアイテムテンプレートにペットのコレクションを表示することもできます。ASP.NET:ネストされたコレクションを持つオブジェクトのデータバインディングと更新

しかし、私は人を更新するとき、私のペットのコレクションはクリアされています!オブジェクトバインディングソースの "Updating"イベントを見ると、e.InputParametersには自分が入力したすべての値が含まれていますが、ペットコレクションには常に0個のアイテムが含まれています。オブジェクトバインディングソースのSelectedイベントを見ると、e.ReturnValueには、ペットを含む選択した人物が含まれていますが、これは正しいです。何か案は?

私の人のクラスと私のリポジトリはここにあります。これは実際にはlinq2hibernateプロジェクトの小さなサンプルです。

public class Person 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public List<Pet> Pets { get; set; } 

    public Person() 
    { 
     Pets = new List<Pet>(); 
    } 
} 

[DataObject] 
public class Repository 
{ 
    List<Person> people = new List<Person>(); 

    public Repository() 
    { 
     //Code to load the person list 
    } 

    public Person FindByID(int ID) 
    { 
     return people.SingleOrDefault(x => x.ID == ID); 
    } 

    public List<Person> FindAll() 
    {       
     return people; 
    }   

    public void Save(Person person) 
    { 
     // code to save a person 
     // Here you can see a person's pets collection is always empty 
     // when this method is called by the objectdatasource 
    } 

    public void Delete(Person person) 
    { 
    }   

    public void Insert(Person person) 
    { 
    } 
} 

答えて

0

私はそれが設計によるものだと考えます。 Saveメソッドに渡されるオブジェクトは、編集中のオブジェクトと同じではありません。オブジェクトバインディングソースは、Saveメソッドを呼び出すときに、新しい Personインスタンスを作成します。リフレクションを使用してプロパティを割り当て、キー/値コレクションに設定されているプロパティのみを割り当てます。私。 DetailsViewUpdatedEventArgs.Keys、NewValues、およびOldValuesからDetailsViewにデータがバインドされているもの。

ペットコレクションを更新していないので、Personレコードだけです。 Saveの中であなたのFindByIDを呼び出し、渡された人から値を再割り当てすることをお勧めします。ペットは同じままです。

私はペットを持つことも可能かもしれないと思います。私が正しく理解していれば、それはカスタムシリアライザを書いて、シリアライズ可能としてマークする必要があります。私はそれを試していない。

関連する問題