如何将中间层的对象连接到由DataSet组成的数据层?

时间:2008-09-29 18:38:22

标签: oop dataset relational

我有一个包含多个相关对象的中间层和一个使用带有多个DataTable和关系的DataSet的数据层。

我想在我的一个对象(父对象)上调用Save方法,并将其私有变量数据转换为DataRow并添加到DataTable中。一些私有变量数据实际上是其他对象(子对象),每个对象都需要调用自己的Save方法并保持自己的变量数据。

我如何“绑”这个?应该在ParentObject中实例化DataSet的哪些部分以及需要将哪些部分传递给ChildObjects以便它们可以将自己添加到数据集中?

另外,如何为2个表连接关系?

我看到订单OrderDetail关系的示例创建OrderRow和OrderDetailRow然后调用OrderDetailRow.SetParentRow(OrderDetail)

我不认为这对我有用,因为我的Order和OrderDetail(使用他们的示例命名)是在不同的类中,并且示例都是在一个大喇叭方法中发生的。

谢谢你, 基思

2 个答案:

答案 0 :(得分:2)

我不会再开始讨论数据集的好坏。如果您继续使用它们,请考虑以下事项:

  • 您需要保留原始数据集并对其进行更新,以便获得正确的插入和更新。
  • 你希望你的父母知道他们的孩子,而不是其他方式。放弃ParentTable。
  • 订单及其OrderDetails是一个聚合(来自域驱动设计),应该被视为一个整体。对order.Save()的调用应该可以保存所有内容。
嗯,这就是理论。我们怎么做?一种方法是创建以下工件:

  • 顺序
  • 的OrderDetail
  • OrderRepository
  • OrderMap

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);

最后的一些说明:

  • 您可以将地图实现为singelton。
  • 让地图使用弱引用。那么任何订单都应该是 垃圾收集的时候, 和记忆将被释放。
  • 您需要某种方式将OrderDetail与其表格行
  • 相关联
  • 如果您有最轻微的升级到.NET 3.5的可能性,那就去做吧。 Linq to Sql或Linq to Entity会消除你的一些痛苦。
  • 所有这一切都是凭空创造的。我希望它不会太不准确。

答案 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);

}

让我知道这看起来如何。这是一个可用的模式还是我错过了一些关键的东西?

谢谢你,
基思