Я недавно начал работать с NHibernate, и у меня возникли проблемы с реализацией модели предметной области, описанной ниже.
То, что я ищу, - это способ фильтрации отношений между Предметом и его коллекцией ItemData в конкретных хранилищах данных. Хранилища данных являются либо глобальными, в этом случае они всегда возвращаются, либо специфичны для идентификатора пользователя (на основе экземпляра приложения).
В SQL это можно сделать с помощью простого запроса:
SELECT * FROM Items i
INNER JOIN ItemData id ON (i.ItemId=id.ItemId)
LEFT OUTER JOIN Users u ON (id.UserId=u.UserId)
LEFT OUTER JOIN DataStore ds ON (id.DataStoreId=ds.DataStoreId)
WHERE ds.IsGlobal = 1 OR ds.UserId = @userId
Структура базы данных:
DataStore:
- DataStoreId (PK)
- Name
- Weight
- UserId
- IsGlobal
Item:
- ItemId (PK)
- ... (non-nullable fields)
ItemData:
- ItemDataId (PK)
- ItemId
- DataStoreId
- ... (nullable fields)
Модель домена:
public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
Id(x => x.Id, "ItemId");
HasMany(x => x.Data)
.KeyColumn("ItemId")
.ApplyFilter<ItemDataFilter>(..?)
.Cascade.AllDeleteOrphan();
}
}
Основная теория заключается в извлечении одной строки ItemData для каждого хранилища данных и присоединении каждого столбца в поле веса соответствующего хранилища данных (первое ненулевое значение, упорядоченное по весу).
Высоко ценится понимание того, как и как это можно сделать в NHibernate.