Доработка Association
От: Enforcer  
Дата: 07.10.10 09:42
Оценка: 33 (1) +1
Хотелось бы узнать какие планы по доработке функционала работы с association?
Ожидаемый функционал (не буду скрывать, провожу аналогии с hibernate):
1. Eager fetching. Автоматическая подгрузка связанных объектов в момент подгрузки основного объекта. Задается новым флажком в Association. Фактическая подгрузка выполняется в том же запросе с помощью join, или отдельным подзапросом. Предусмотреть каскадную подгрузку иерархии объектов. (как в hibernate)

2. Lazy fetching. Отложенная подгрузка связанных объектов. Задается новым флажком в Association. Варианты имплементации:

2.1 Специальная имплементация List, которая хранит primary key родительского объекта и ссылку на DataContext. При первом обращении отправляет запрос в БД (hibernate)

2.2 Специальная имплементация List, которая хранит primary key родительского объекта. Вызовом специального метода, вроде List DataContext.Attach(List), делается фактическое обращение в БД. Т.е. код будет выглядеть:
var p = from p in db.GetTable<Person>() where p.id=5 select p;
p.Addresses = db.Attach(p.Addresses)

2.3 DataAccess с соответствующей аннотацией. Код генерится MSIL как сейчас генерится для EditableObject например:
[EntityAccessor(type="Person", fetchProps="Phones, Addresses", dataContext="db")]
abstract public void FetchPersonChildren(Person p, DataContext db)
Имплементация берет айдишник у Person (или несколько, если ключ составной), запрашивает по нему дочерние списки Phones, Addresses, записывает в свойства Person.
Т.е. генерится код по сути аналогичный:
public void FetchPersonChildren(Person p, DataContext db)
{
p.Addresses = (from a in db.GetTable<Address>() where a.PersonID = p.ID select a).ToArray();
p.Phones = (from p in db.GetTable<Phone>() where p.PersonID = p.ID select p).ToArray();
}
Также желательно предусмотреть возможность каскадного запроса иерархии объектов.

3. Каскадный insert. Вставляется родительский объект, получается значение identity (если есть), primary key родительского объекта автоматически проставляется в соответствующие поля дочерних объектов, вставляются дочерние объекты, в т.ч. каскадно для иерархии объектов

4. Имплементация linq запросов вида
from p in db.GetTable<Person>() where p.id = 5 select p.Phones
т.е. когда возвращается дочерний список. сейчас ту же самую конструкцию приходится писать через анонимные классы:
from p in db.GetTable<Person>() where p.id = 5 select new {Phones=p.Phones}

ИМХО данные методы не нарушают идею BLToolkit, имплементация должна быть не сложнее чем имплементация linq.
Естественно это далеко не полный список, но думаю в процессе доработки автору либы будет ясно какой еще функционал потребуется чтобы получить целостную прослойку по работе с ассоциациями
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.