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

Oop 如何将对象的中间层连接到由数据集组成的数据层?,oop,dataset,relational,Oop,Dataset,Relational,我有一个包含多个相关对象的中间层和一个使用具有多个数据表和关系的数据集的数据层 我想对我的一个对象(父对象)调用Save方法,并将其私有变量数据转换为DataRow并添加到DataTable。一些私有变量数据实际上是其他对象(子对象),每个对象都需要调用自己的Save方法并保存自己的变量数据 我怎么才能把它“系”在一起?数据集的哪些部分应该在ParentObject中实例化,哪些部分需要传递给ChildObject以便它们可以将自己添加到数据集 另外,如何将两个表的关系连接在一起 我看到的Ord

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

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

我怎么才能把它“系”在一起?数据集的哪些部分应该在ParentObject中实例化,哪些部分需要传递给ChildObject以便它们可以将自己添加到数据集

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

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

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

谢谢,,
Keith

因此,我现在要做的是将对数据集的引用和对父对象的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);

}
让我知道这是什么样子。这是一个可用的模式还是我遗漏了一些关键的东西

谢谢你,

基思

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

  • 您需要保留原始数据集并对其进行更新,以便获得正确的插入和更新
  • 你想让你的父母了解他们的孩子,但不是相反。驱逐父表
  • 订单及其OrderDetails是一个聚合(来自域驱动设计),应该作为一个整体考虑。调用order.Save()应该保存所有内容
这就是理论。我们怎么能做到呢?一种方法是创建以下工件:

  • 命令
  • 订单详情
  • 订单存储库
  • 订单地图
OrderMap是管理订单到数据集关系的地方。在内部,它可以使用哈希表或字典

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

只要订单处于活动状态,OrderMap就必须保持活动状态。 订单包含所有订单详细信息

将订单传递到存储库并让它保存。存储库将从映射中获取数据集,从订单中更新订单表,并迭代所有订单详细信息以更新订单详细信息表

检索并保存:

var order = repository.GetOrder(id);
repository.Save(order);
在OrderRepository.GetOrder()内部:

在OrderRepository.Save()中:

最后的一些注意事项:

  • 您可以将映射实现为一个singleton
  • 让贴图使用弱引用。那么任何订单都应该 垃圾应该收集的时候收集, 内存将被释放
  • 您需要某种方法将OrderDetail与其表行相关联
  • 如果您有升级到.NET3.5的任何可能性,请执行此操作。LINQtoSQL或LINQtoEntity将消除您的一些痛苦
  • 所有这些都是凭空产生的。我希望不是太不准确

我认为没有答案,因为很难从描述中看出你在做什么。举个例子可能会有所帮助
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);
var ds = map.GetDataSetFor(order);
UpdateFromOrder(ds, order);
foreach(var detail in order.Details) UpdateFromDetail(ds.OrderDetail, detail);