【问题标题】:How to wire a middle tier of Objects to a data tier consisting of a DataSet?如何将对象的中间层连接到由 DataSet 组成的数据层?
【发布时间】:2008-09-29 18:38:22
【问题描述】:

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

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

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

另外,我如何将两个表的关系连接在一起?

我看到的关于 Order OrderDetail 关系的示例创建了 OrderRow 和 OrderDetailRow,然后调用 OrderDetailRow.SetParentRow(OrderDetail)

我认为这对我不起作用,因为我的 Order 和 OrderDetail(使用它们的示例命名)位于不同的类中,并且示例都在 Big Honking Method 中发生。

谢谢你, 基思

【问题讨论】:

  • 我认为没有答案,因为很难从描述中看出你在做什么。一个例子可能会有所帮助

标签: oop dataset relational


【解决方案1】:

我不会再争论数据集是好是坏。如果您继续使用它们,请考虑以下几点:

  • 您需要保留原始数据集并对其进行更新,以便获得正确的插入和更新。
  • 您希望您的父母了解他们的孩子,而不是相反。消除 ParentTable。
  • 订单及其 OrderDetails 是一个聚合(来自领域驱动设计),应该作为一个整体来考虑。调用 order.Save() 应该可以保存所有内容。

嗯,这就是理论。我们怎么能做到这一点?一种方法是创建以下工件:

  • 订购
  • 订单详情
  • 订单仓库
  • OrderMap

OrderMap 是您管理订单到数据集关系的地方。在内部,它可以使用 Hashtable 或 Dictionary。

OrderRepository 是您从中获取订单的地方。存储库将从某处获取包含所有关系的数据集,使用其所有 OrderDetails 构建 Order,并将 Order/Dataset 关系存储在 OrderMap 中。

只要 Order 存在,OrderMap 就必须保持活跃。 Order 包含所有 OrderDetails。

将订单传递到存储库并让它保存。存储库将从地图中获取数据集,从订单中更新订单表并迭代所有订单详情以更新订单详情表。

检索并保存:

var order = repository.GetOrder(id);
repository.Save(order);

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

在 OrderRepository.Save() 内部:

var ds = map.GetDataSetFor(order);
UpdateFromOrder(ds, order);
foreach(var detail in order.Details) UpdateFromDetail(ds.OrderDetail, detail);

一些最后的笔记:

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

【讨论】:

    【解决方案2】:

    所以,我现在正在做的是将对 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);
    
    }
    

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

    谢谢你,
    基思

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 2017-12-14
      • 1970-01-01
      • 2022-01-08
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多