我有一个包含多个相关对象的中间层和一个使用带有多个DataTable和关系的DataSet的数据层。
我想在我的一个对象(父对象)上调用Save方法,并将其私有变量数据转换为DataRow并添加到DataTable中。一些私有变量数据实际上是其他对象(子对象),每个对象都需要调用自己的Save方法并保持自己的变量数据。
我如何“绑”这个?应该在ParentObject中实例化DataSet的哪些部分以及需要将哪些部分传递给ChildObjects以便它们可以将自己添加到数据集中?
另外,如何为2个表连接关系?
我看到订单OrderDetail关系的示例创建OrderRow和OrderDetailRow然后调用OrderDetailRow.SetParentRow(OrderDetail)
我不认为这对我有用,因为我的Order和OrderDetail(使用他们的示例命名)是在不同的类中,并且示例都是在一个大喇叭方法中发生的。
谢谢你, 基思
答案 0 :(得分:2)
我不会再开始讨论数据集的好坏。如果您继续使用它们,请考虑以下事项:
OrderMap是您管理订单到数据集关系的地方。在内部,它可以使用Hashtable或Dictionary。
OrderRepository是您从中获取订单的地方。存储库将从某处获取包含所有关系的数据集,使用其所有OrderDetails构建Order,并将Order / Dataset关系存储在OrderMap中。
只要订单有效,OrderMap必须保持活动状态。 订单包含所有OrderDetails。
将订单传递给存储库并让它保存。存储库将从映射中获取数据集,从订单更新Order-table并迭代所有订单详细信息以更新OrderDetail表。
检索并保存:
var order = repository.GetOrder(id);
repository.Save(order);
Inside OrderRepository.GetOrder():
var ds = db.GetOrderAndDetailsBy(id);
var order = new Order();
UpdateOrder(ds, order);
UpdateOrderDetails(ds, order); // creates and updates OrderDetail, add it to order.
map.Register(ds, order);
Inside OrderRepository.Save():
var ds = map.GetDataSetFor(order);
UpdateFromOrder(ds, order);
foreach(var detail in order.Details) UpdateFromDetail(ds.OrderDetail, detail);
最后的一些说明:
答案 1 :(得分:0)
所以,我现在正在做的是将对DataSet的引用和对父对象的DataRow的引用传递给子对象的Save方法。
这是一个显示我正在做的概念的小代码。
// some random save event in a gui.cs//
public void HandleSaveButtonClick()
{ parentObject.Save(); }
// Save inside the parentObject.cs //
public void Save()
{
CustomDataSet dataSet = new CustomDataSet();
ParentObjectTableAdapter parentTableAdapter = new ParentObjectTableAdapter();
DataTable dt = dataSet.ParentTable;
DataRow newParentDataRow = dt.NewRow();
newParentDataRow["Property1"] = "Hello";
newParentDataRow["Property2"] = "World";
dt.Rows.Add(newParentDataRow);
parentTableAdapter.Update(dataSet.ParentTable);
//save children
_child1.Save(dataSet, newParentDataRow)
dataSet.AcceptChanges();
}
//Save inside child1.cs //
public void Save(CustomDataSet dataSet, DataRow parentRow)
{
Child1TableAdapter childTableAdapter= new Child1TableAdapter();
DataTable dt = dataSet.ChildTable;
DataRow dr = dt.NewRow();
dr.SetParentRow(parentRow);
dr["CProp1"] = "Child Property 1";
dt.Rows.Add(dr);
childTableAdapter.Update(dataSet.ChildTable);
}
让我知道这看起来如何。这是一个可用的模式还是我错过了一些关键的东西?
谢谢你,
基思