我不会再开始争论数据集是好是坏。如果您继续使用它们,请考虑以下几点:
- 您需要保留原始数据集并对其进行更新,以便获得正确的插入和更新。
- 你希望你的父母了解他们的孩子,但不是相反。放逐父表。
- 订单及其 OrderDetails 是一个聚合(来自领域驱动设计),应该被视为一个整体。调用 order.Save() 应该可以保存所有内容。
嗯,这就是理论。我们怎么能做到这一点?一种方法是创建以下工件:
OrderMap 是您管理订单到数据集关系的地方。在内部,它可以使用 Hashtable 或 Dictionary。
OrderRepository 是您从中获取订单的地方。存储库将从某处获取包含所有关系的数据集,使用其所有 OrderDetails 构建订单,并将订单/数据集关系存储在 OrderMap 中。
只要 Order 还活着,OrderMap 就必须保持活跃。订单包含所有 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 将消除您的一些痛苦。
- 这一切都是凭空创造出来的。我希望它不会太不准确。