我用“Person”类制作了一个小例子,其中包含Pets列表。此外,还有一个可以保存/删除/选择Person对象的简单存储库。 现在我在表单上放置一个表单视图(或详细信息视图),选择一个指向我的存储库的对象数据源。到目前为止,它完美地运作,我可以创建,更新,删除人...我甚至可以在我的视图中显示我的宠物集合在项目模板中。
但是当我更新一个人时,我的宠物收集就被清除了!当我查看对象绑定源的“正在更新”事件时,e.InputParameters包含我输入的所有值,但pets集合始终包含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 :(得分:0)
我相信这是设计上的。传递给Save方法的对象与您正在编辑的对象不同。对象绑定源在调用Save方法时创建Person的 new 实例。它使用反射分配属性,并仅分配在键/值集合中设置的属性。即那些你的DetailsView有数据绑定的那些,特别是来自DetailsViewUpdatedEventArgs.Keys,NewValues和OldValues。
这是有道理的,因为您没有更新Pets系列,只有人员记录。我建议,在Save你打电话给你的FindByID并重新分配过往的人的价值 - 宠物将保持不变。
我认为也可以养宠物。如果我理解正确,则需要编写自定义序列化程序并将Person标记为Serializable。我没试过。