我最近开始使用 NHibernate,并且在实现进一步概述的域模型时遇到了一些麻烦。
我正在寻找的是一种过滤 Item 与其在特定 DataStore 上的 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();
}
}
基本理论是为每个 DataStore 获取一个 ItemData 行,并在各个 DataStore 的权重字段上连接每一列(按权重排序的第一个非空值)。
关于是否以及如何在 NHibernate 中实现这一点的见解将不胜感激。