Nhibernate 从自定义缓存检索的多对一关系

Nhibernate 从自定义缓存检索的多对一关系,nhibernate,caching,fluent-nhibernate,Nhibernate,Caching,Fluent Nhibernate,这更像是一个理论问题 我有一个表用于保存字典项,下一个表用于保存用户数据。 用户表包含字典项表上指示的多对一类型的大量引用合谋。它看起来像: public class User { public int Id; public Dictionary Status; public Dictionary Type; public Dictionary OrganizationUnit; ...... } 我希望在应用程序启动时检索所有字典,然后当我检索用户并调用引用属性到字典时,应该从缓存中获取字典

这更像是一个理论问题

我有一个表用于保存字典项,下一个表用于保存用户数据。 用户表包含字典项表上指示的多对一类型的大量引用合谋。它看起来像:

public class User
{
public int Id;
public Dictionary Status;
public Dictionary Type;
public Dictionary OrganizationUnit;
......
}
我希望在应用程序启动时检索所有字典,然后当我检索用户并调用引用属性到字典时,应该从缓存中获取字典对象

我知道在这种情况下我可以使用二级缓存,但我对其他解决方案感兴趣。有吗


可以创建我的自定义类型,并说:使用我的自定义缓存在多个会话中检索字典的值???

二级缓存是最好的答案,我能想到的唯一其他从缓存填充对象而不使用二级缓存的解决方案是使用onLoad拦截器(只需将字典保持在未映射状态)或在应用程序中的某个位置手动执行


但是为什么不想使用seocondlevel缓存呢?如果您对缓存的看法与hibernate中的存储非常不同,那么您可以实现自己的提供程序?

为什么不将其存储在会话中?只需将记录集拉一次,并将其推送到会话中,然后在每次需要时检索它。我对其他东西做了类似的事情,我相信我的方法应该适合你。在我的代码中,我有一个会话管理器,我直接从任何代码段调用它需要会话值。我选择这种方法是因为我可以查询结果,我可以操作存储和检索方法。当依赖NHibernate为e、 我没有控制粒度,无法使特定记录集仅对特定会话可用。我还发现NHibernate不如直接使用会话有效。在分析CPU和内存使用情况时,我发现此方法速度更快,占用的内存更少。如果您想在站点级别改为在会话中,查看HttpContext.Current.Cache

以下示例非常适合存储和检索记录集:

// Set the session
SessionManager.User = (Some code to pull the user record with relationships.  Set the fetch mode to eager for each relationship else you will just have broken references.)

// Get the session
User myUser = SessionManager.User;



public static class SessionManager
{
    public static User User
    {
        get { return GetSession("MySessionUser") as User; }
        set { SetSession("MySessionUser", value); }
    }

    private static object GetSession(string key)
    {
        // Fix Null reference error
        if (System.Web.HttpContext.Current == null || System.Web.HttpContext.Current.Session == null)
        {
            return null;
        }
        else
        {
            return System.Web.HttpContext.Current.Session[key];
        }
    }

    private static void SetSession(string key, object valueIn)
    {
        // Fix null reference error
        if (System.Web.HttpContext.Current.Session[key] == null)
        {
            System.Web.HttpContext.Current.Session.Add(key, valueIn);
        }
        else
        {
            System.Web.HttpContext.Current.Session[key] = valueIn;
        }
    }
}

为什么我不使用二级缓存呢?我正在为字典项设计更复杂的结构,然后我不得不使用二级缓存处理许多查询和选项卡,第二个原因是我几乎已经为字典创建了结构,我不想更改它们。第三个原因是我使用Linq,nhibernate 3.1中有很多错误我想我已经找到了其他解决方案,而不是使用多对一,我将使用标准列映射(Map)使用包含对我的字典缓存的引用的用户类型。我明天将尝试此操作。这是一种解决方案,但当我有下一个类(例如包含比用户类更多字典属性的产品)时该怎么办。然后我使用字典检索用户,使用字典检索产品。我更喜欢一次检索所有字典启动应用程序,然后缓存它们,然后映射用户类型(IUserType)上的所有字典类型属性,并在自定义类型中从该缓存中检索字典类型的引用对象-对我来说,这是一个完美的解决方案。