流畅的NHibernate,动态更改映射表?

时间:2010-02-18 17:02:24

标签: asp.net asp.net-mvc fluent-nhibernate

使用流畅的nhibernate,有没有办法在运行时动态切换映射表?

例如:

public class XYClassMap : ClassMap<XY>
{
  public XYClassMap( )
  {
    Table("XYTable");
    Id(d => d.Id).GeneratedBy.Identity();
    Map(d => d.Value);
    (...)

鉴于有多个插件,每个插件都使用这一个类,但它们需要使用不同的表。我正在寻找这样的东西:

public class XY {
  public string Tablename {get; set;}
}

public class XYClassMap : ClassMap<XY>
{
  public XYClassMap( )
  {
    Table(Tablename);
    Id(d => d.Id).GeneratedBy.Identity();
    Map(d => d.Value);
    (...)

因此,每个操作方法都可以使用同一个类,只需要将此属性设置为“Tablename”。

感谢您的帮助,

斯特芬

1 个答案:

答案 0 :(得分:2)

映射是在应用程序启动时编译的,一旦发生这种情况,它们就无法更改。

如果您的插件使用不同的表,那么根据定义它们不是相同的实体(因此也是相同的映射)。如果你的插件都定义了所有具有相同结构的不同表,那么你需要单独的映射,但是你可以抽象出实际的定义。

这样的事情,或许:每个插件都定义了它自己的这个表的映射,它从包含除表名之外的实际映射的抽象类派生。

public abstract class PluginMap<T> : ClassMap<T> where T : IPlugin
{
  public PluginMap()
  {
    Id(d => d.Id).GeneratedBy.Identity();
    Map(d => d.Value);
  }
}

public class PluginOneMap : PluginMap<PluginOne>
{
  public PluginOneMap()
  {
    Table("PluginOne");
  }
}

public class PluginTwoMap : PluginMap<PluginTwo>
{
  public PluginTwoMap()
  {
    Table("PluginTwo");
  }
}

或者,您可以在每个子类的表或每个继承的表层次结构中将它们定义为子类。