Я не буду начинать еще одну дискуссию о том, хорошие или плохие наборы данных. Если вы продолжаете использовать их, вот что нужно учитывать:
- Вам необходимо сохранить исходный набор данных и обновить его, чтобы получить правильные вставки и обновления.
- Вы хотите, чтобы ваши родители знали своих детей, но не иначе. Изгнать родительскую таблицу.
- Заказ и его OrderDetails являются совокупностью (из доменного дизайна) и должны рассматриваться как единое целое. Вызов на заказ. Save () должен сохранить все.
Ну, это теория. Как мы можем сделать это? Одним из способов является создание следующих артефактов:
- Заказать
- OrderDetail
- OrderRepository
- OrderMap
OrderMap - это место, где вы управляете отношениями между Order и Dataset. Внутренне он может использовать Hashtable или Dictionary.
Репозиторий Order - это место, откуда вы получаете ваши Заказы. Хранилище получит набор данных со всеми связями откуда-то, построит Order со всеми его OrderDetails и сохранит отношение Order / Dataset в OrderMap.
Карта ордена должна сохраняться в течение всего времени существования Ордена.
Заказ содержит все детали заказа.
Передайте заказ в хранилище и дайте ему сохранить его. Хранилище получит набор данных с карты, обновит таблицу заказов из заказа и выполнит итерацию всех деталей заказа, чтобы обновить таблицу OrderDetail.
Получить и сохранить:
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 снимут часть вашей боли.
- Все это создано из воздуха. Я надеюсь, что это не слишком неточно.