NHibernate:根据上下文使用略有不同的hbm映射文件

时间:2009-12-16 01:40:02

标签: nhibernate

我的一个应用程序是公共网站,另一个是内部网。公共网站使用必须通过视图访问某个表的有限安全用户运行,而Intranet可以访问该表本身。

使用Fluent NHibernate进行设置似乎很简单。在我的ClassMap中,我可以这样检查:

public class MyEntityClassMap : ClassMap<MyEntity>
{
     public MyEntityClassMap()
     {
         if (NHibernateConfig.Current.Context == "intranet")
            Table("t_MyEntity");
         else
            Table("v_MyEntity_pub");
         ... etc
     }
}

是否有一种简单的方法可以为嵌入式hbm文件执行此操作?我能想到的唯一方法就是拥有两份hbm文件,这会让人感到困惑,而且远非理想。

是否有更好的方法可以达到相同的效果?

2 个答案:

答案 0 :(得分:3)

实际上你问的是可能的。实际上,您可以在构建SessionFactory之前访问嵌入的XML文件并更改其内容(在Application Start上)。

假设您将默认选择在实体中引用“t_MyEntity”,那么当您想要引用“v_MyEntity_pub”表时,您可以动态更改此引用(代码可能无法正常工作,但您将得到这个想法):

    NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
    cfg.AddAssembly(ASSEMBLYNAME);

    if (NHibernateConfig.Current.Context != "intranet") //this is how you have stated you distinguish the intranet application from the other one.
    {
        string[] resourcesNames = assembly.GetManifestResourceNames();
        foreach (string resourceName in resourcesNames)
        {
            StreamReader sr = new  StreamReader(assembly.GetManifestResourceStream(resourceName));
            string resourceContent = sr.ReadToEnd();
            resourceContent = resourceContent.Replace("t_MyEntity", "v_MyEntity_pub");
            cfg.AddXmlString(resourceContent);
        }
     }

     ISessionFactory sessionFactory = cfg.BuildSessionFactory();

上述代码应仅在应用程序的生命周期内执行一次,并且仅针对Intranet应用程序执行。

答案 1 :(得分:0)

虽然这可能不是对您的问题最有帮助的答案,但我不相信这在映射文件中是可能的。我也不认为两个hbm文件可以用于同一个名称,因为它无法区分这两个文件,而是必须有两个相同的对象,每个对象的名称和映射文件略有不同。正如你在你的问题中所说的那样,完全是令人困惑的,理想的只是你希望有一天能够达到的地平线。

为什么无法通过视图直接访问所有内容?我假设这个过程中没有写作?有没有什么办法可以在保持安全性的同时更改这种访问数据的方法?