powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Cascade или один обработчик на несколько DataSet'ов
3 сообщений из 3, страница 1 из 1
Cascade или один обработчик на несколько DataSet'ов
    #33223192
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть приложение в котором рожаются на каждую сессию по два DataSet'а (MainDataSet, CustomDataSet). Некоторые таблицы в CustomDataSet ссылаются на таблицы в MainDataSet (master-details). ID'шные поля в master-таблицах в MainDataSet:
Код: plaintext
1.
2.
3.
AutoIncrement=true;
AutoIncrementSeed=- 1 ;
AutoIncrementStep=- 1 ;
При сохранении в БД оттуда возвращается @@IDENTITY и, соответственно, происходит замена в master-таблицах DataSet'а. Вот тут и получается загогулина: необходимо организовать каскадирование между master-details таблицами в этих двух DataSet'ах (т.е. заменить ID'шки в details-таблицах в CustomDataSet'е на уже реальные в master-таблицах). Поскольку это разные DataSet'ы, то просто тупо построить relations не получается ("Cannot have a relationship between tables in different DataSets."). Попробовал выкрутиться таким макаром: перехватил OnColumnChange и в нем подправлял
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
static DataTable
  DetailsTableInCustomDataSet;
...
public static void CascadeTable(object sender, DataColumnChangeEventArgs e)
{
   if(sender.ToString()!="MasterTableInMainDataSet"
      || e.Column.ColumnName!="Id")
     return;

   int
     tmpId;

   string
     ColumnName="IdInDetailsTableInCustomDataSet";

   foreach(DataRow row in DetailsTableInCustomDataSet.Rows)
     if(Convert.ToInt32(row[ColumnName])==Convert.ToInt32(e.Row[e.Column.ColumnName,DataRowVersion.Current])
        && Convert.ToInt32(row[ColumnName])!=(tmpId=Convert.ToInt32(e.Row[e.Column.ColumnName])))
       row[ColumnName]=tmpId;
}
//---------------------------------------------------------------------------
Но поскольку DataColumnChangeEventHandler требует static-метод, то для передачи details-таблицы в него пришлось объявить static DetailsTableInCustomDataSet. И вот тут все рухнуло. Поскольку сессий-то - немерянно. При старте нескольких сессий - каждая тянет одеяло на себя. Обставился буйками:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
lock(CustomDataSet.DetailsTableInCustomDataSet)
{
   CustomDataSet.DetailsTableInCustomDataSet=((CustomDataSet)Session["CustomDataSet"]).Tables["DetailTableInCustomDataSet"];
   MasterTableInMainDataSet.ColumnChanged+=new DataColumnChangeEventHandler(CustomDataSet.CascadeTable);
   UploadToDataBaseMainDataSet();
   MasterTableInMainDataSet.ColumnChanged-=new DataColumnChangeEventHandler(CustomDataSet.CascadeTable);
}
UploadToDataBaseCustomDataSet();
...
Вроде все забегало... Но - не ндравиться мне это самому... Уж очень ректально как-то все получается... Можно ли как то все это более по-людськи сделать? Предложение пересмотреть/переделать структуру хранения данных не принимаются - приложение уже готово и эксплуатируется. Теперь оно просто наращивается всякими-разными Custom подзадачами.
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
Cascade или один обработчик на несколько DataSet'ов
    #33223429
Фотография Sam Andrews
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему нельзя обойтись одним датасетом?

с уважением...
...
Рейтинг: 0 / 0
Cascade или один обработчик на несколько DataSet'ов
    #33224292
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да в том-то вся и фишка. Есть ядро, которое работает с MainDataSet'ом. И есть Custom подзадачи, которые реализованы в виде plugin'ов. Т.е. в ядре есть только точка входа в них. А дальше они копошаться и живут своей жизнью. Ессесно, юзая помимо своих данных из CustomDataSet'а также данные из MainDataSet'а. Эти подзадачи сегодня могут быть, а завтра уже - нет. И внедрять их в MainDataSet нет смысла. Т.е. MainDataSet не знает и не должен знать о них.
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Cascade или один обработчик на несколько DataSet'ов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]