我的一个应用程序是公共网站,另一个是内部网。公共网站使用必须通过视图访问某个表的有限安全用户运行,而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文件,这会让人感到困惑,而且远非理想。
是否有更好的方法可以达到相同的效果?
答案 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文件可以用于同一个名称,因为它无法区分这两个文件,而是必须有两个相同的对象,每个对象的名称和映射文件略有不同。正如你在你的问题中所说的那样,完全是令人困惑的,理想的只是你希望有一天能够达到的地平线。
为什么无法通过视图直接访问所有内容?我假设这个过程中没有写作?有没有什么办法可以在保持安全性的同时更改这种访问数据的方法?