我最近刚开始使用NHibernate,但在实现下面概述的域模型时遇到了一些麻烦。我正在寻找的是一种过滤项目与特定DataStore上的ItemData集合之间的关系的方法。数据存储区是全局的(在这种情况下总是返回),或者是特定于用户身份的(基于应用程序实例)。在SQL中,可以使用一个简单的查询来完成:SELECT * FROM Items iINNER 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- IsGlobalItem:- 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中是否以及如何实现这一点的见解将不胜感激。 最佳答案 如果其他人正在寻找此信息,这就是我发现的内容。1.创建一个自定义过滤器:public class ItemDataFilter : FilterDefinition{ public ItemDataFilter() { WithName("ItemDataFilter").WithCondition("Data.DataStoreId == :DataStoreId").AddParameter("DataStoreId", NHibernate.NHibernateUtil.Int32); }}2,修改您的Fluent NHibernate属性映射(使用.ApplyFilter ()):HasMany(x => x.Data) .KeyColumn("ItemId") .ApplyFilter<ItemDataFilter>() .Cascade.AllDeleteOrphan();3.在您的存储库中,启用过滤器并为当前会话设置其属性:public IList<Item> GetItemsByDataStore(int DataStoreId) { using (var session = NHibernateHelper.OpenSession()) { session.EnableFilter("ItemDataFilter").SetParameter("DataStoreId", DataStoreId); return session.CreateCriteria(typeof(Item)).List<Item>(); }}执行此操作的另一种方法是获取每个Item的所有ItemData并添加另一个执行此筛选的非映射属性。
10-06 00:34