русский
Germany.ruForen → Архив Досок→ Programmierung

.Net - DataSet... с динамическими таблицами

255  
Murr коренной житель14.07.09 13:24
Murr
NEW 14.07.09 13:24 
Снова хочется необычного...
Как все должно быть знают, в .Net DataSet создается таким каким он описан в его схеме.
Поверх этого накладывается всякая мелочь написанная прогерами... времени на это
убивается столько, что охота все бросить... особливо, если база еще не до конца
спроектирована, а таблицы используются в нескольких датасетах...
В .Net есть утилитка xsd.exe слегка упрощающая жизнь - по предоставленной схеме
может сгенерить тот код, что предоставляет Студия при создании датасета. Схему,
в большинстве случаев, можно выгрузить какой-нибудь тулузкой... В прочем, в ситуации
с меняющейся базой это все одно достаточно неприятно...
Думаю, что избежать большинства неприятностей с меняющейся базой можно если
сделать врапер к датасету, полностью изолирующий сам датасет и предоставляющий
интерфейсы в терминах задачи(базы?).
Что-то типа такого (от балды):
База:
таблица Order
- IDs PK;
- ClientID FK;
- ItemID FK;
- Qty int;
таблица Goods
- IDs PK;
- Description string;
- Notes text;
таблица Clients
- IDs PK;
- Name string;
- Shurename string;
- DateOfBirth date;
Тогда представление может быть таким
public class TMyDB
{
...

public TOrder Order { get; }
public TGoods Goods { get; }
public TClients Clients { get; }
// какой-то обобщенный интерфейс
Load() {...}
Save() {...}
Clear() {...}
}
public class TOrder
{
public TOrderRows Rows { get; }

// и опять интерфейс
Load() {...}
Save() {...}
Clear() {...}
}
...
public TOrderRow
{
public PK IDs { get; }
public FK ClientID { get; set; }
public FK ItemID { get; set; }
public int Qty { get; set; }
}
и т.п.


При трех таблицах в базе все это можно вполне запихать в один датасет и не сильно волноваться
об последствиях. Однако при сотне-другой таблиц датасет станет слишком тяжелым. А при
частичной загрузке связанных данных - практически неуправляемым. Потому, думаю, что создавать
реальные представления таблиц нужно в динамике. Например, при первом обращении к таблице.
Все вроде выглядит не сложно.
Вопрос в том, что и как создавать. Классы, сгенеренные xsd.exe вполне неплохи, но в этом
варианте достаточно бесполезны. Так что практически весь код создания таблицы и добавления
ее в датасет отпадает. Можно написать новый генератор, но как-то лениво с этим возится.
Потому есть желание иметь аналог xsd.exe, выполняющий не генерацию кода, а создание
собственно заданной таблицы на базе XSD-схемы. Порылся в инете на предмет подобных вещей
- пока не нашел - все идут проторенной дорожкой - схема > код > Студио и пляски с бубном.
Хотелось бы услышать мнение об самой идее и об способе реализации.
P.S. К NHibernate пока просьба не отсылать...

#1 
  scorpi_ постоялец14.07.09 18:39
NEW 14.07.09 18:39 
in Antwort Murr 14.07.09 13:24
В ответ на:
P.S. К NHibernate пока просьба не отсылать...

В начале поста надо было это написать. А то я уж было начал тебя туда отсылать. А почему собственно не отсылать?
#2 
Murr коренной житель15.07.09 00:49
Murr
NEW 15.07.09 00:49 
in Antwort scorpi_ 14.07.09 18:39
А потому, что хочется сделать что-то по-проще... по-примитивнее...
Что-то упрощающее до уровня:
TDb db = TDb.Instance;
db.StorageInterface = new TStorageInterfaceImpl(); // замена имеющегося по умолчанию
TTableA tableA = db.TableA;
for(int i= 0; i<100; ++i)
{
TTableARow tableARow = tableA.NewRow(); // или = tableA.Rows.New(); - не решил еще
tableARow.IntegerField = i;
}
tableA.Rows[40].IntegerField = 440;
db.Save(); // вся сотня записей для этого примера и все данные что имеются (для нескольких таблиц)
db.Clear();
// работаем с двумя таблицами
TTableB tableB = db.TableB;
TTableB tableС = db.TableС;
etc...
т.е. интуитивно понятное и генерируемое без проблем.
С NHibernate у меня получается сложнее... хотя, возможно, Я потратил на него недостаточно
времени...
#3 
  scorpi_ постоялец15.07.09 02:30
NEW 15.07.09 02:30 
in Antwort Murr 15.07.09 00:49
А L2S?
#4 
toptop знакомое лицо15.07.09 08:42
NEW 15.07.09 08:42 
in Antwort Murr 15.07.09 00:49
Или EF?
#5 
Murr коренной житель15.07.09 11:06
Murr
NEW 15.07.09 11:06 
in Antwort scorpi_ 15.07.09 02:30
А по-подробнее? Гоогла мало что полезного выдает.
#6 
Murr коренной житель15.07.09 11:10
Murr
NEW 15.07.09 11:10 
in Antwort toptop 15.07.09 08:42
Аналогично. Какой-нибудь линк на начало?
#7 
  scorpi_ постоялец15.07.09 11:22
NEW 15.07.09 11:22 
in Antwort Murr 15.07.09 11:06
LINQ to SQL
Entity Framework - говорят сырой ещё.
#8 
Murr коренной житель15.07.09 12:29
Murr
NEW 15.07.09 12:29 
in Antwort scorpi_ 15.07.09 11:22
LINQ я как-то смотрел. Первым впечатлением было недоумение - тянут псевдоСКЛ в код форм...
Потом смотрел внимательнее... в тех задачах, под которые Я нарабатываю код, есть всего
2-3 места, где выполнить работу не используя LINQ или SQL будет относительно сложно...
Так что Я решил на нем не заморачиваться и подумать об том, как сделать ту же работу, но
более легким способом... пришел в выводу, что надо определить что-то типа TFilter на базе
массива записей и отдавать его в качестве параметра. Не на много сложнее дополнительного
синтаксиса LINQ и не выпадает из парадигмы ООП...
#9 
toptop знакомое лицо16.07.09 10:21
NEW 16.07.09 10:21 
in Antwort Murr 15.07.09 11:10
См у scorpi_ Entity Framework
#10 
toptop знакомое лицо16.07.09 10:25
16.07.09 10:25 
in Antwort scorpi_ 15.07.09 11:22
Да, EF еще сыроват, но на последней M$ тусовке Dariusz Parys http://blogs.msdn.com/dparys/ говорил, что вроде M$ планируют дальше только EF двигать. Хотя, кто их знает?
Если они с SP1 кучу нового включают, что собственно минимум 3.6 должно называться.
#11