Как связать средний уровень объектов с уровнем данных, состоящим из набора данных? - PullRequest
1 голос
/ 29 сентября 2008

У меня есть средний уровень, содержащий несколько связанных объектов, и уровень данных, который использует набор данных с несколькими таблицами данных и связями.

Я хочу вызвать метод Save для одного из моих объектов (родительского объекта) и преобразовать данные его частной переменной в DataRow и добавить в DataTable. Некоторые из данных закрытых переменных на самом деле являются другими объектами (дочерними объектами), для каждого из которых должен быть вызван собственный метод Save, а их собственные данные переменных сохранены.

Как мне "зашнуровать" это вместе? Какие части DataSet должны быть созданы в ParentObject, а какие должны быть переданы ChildObjects, чтобы они могли добавить себя в набор данных?

Кроме того, как связать отношения для двух таблиц?

Примеры, которые я видел для отношения OrderDetail, создают OrderRow и OrderDetailRow, затем вызывают OrderDetailRow.SetParentRow (OrderDetail)

Я не думаю, что это будет работать для меня, поскольку мои Order и OrderDetail (с использованием имен их примеров) находятся в отдельных классах, и в примерах все это происходит методом Big Honking.

Спасибо, Кит

Ответы [ 2 ]

2 голосов
/ 26 октября 2008

Я не буду начинать еще одну дискуссию о том, хорошие или плохие наборы данных. Если вы продолжаете использовать их, вот что нужно учитывать:

  • Вам необходимо сохранить исходный набор данных и обновить его, чтобы получить правильные вставки и обновления.
  • Вы хотите, чтобы ваши родители знали своих детей, но не иначе. Изгнать родительскую таблицу.
  • Заказ и его 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 снимут часть вашей боли.
  • Все это создано из воздуха. Я надеюсь, что это не слишком неточно.
0 голосов
/ 30 сентября 2008

Итак, сейчас я делаю передачу ссылки на 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);

}

Дайте мне знать, как это выглядит. Это полезный шаблон или я что-то упускаю?

Спасибо,
Keith

...