代码之家  ›  专栏  ›  技术社区  ›  Steffen

Fluent NHibernate,动态更改映射表?

  •  3
  • Steffen  · 技术社区  · 15 年前

    使用FluentNHibernate,有没有一种在运行时动态切换映射表的方法?

    例如:

    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);
        (...)
    

    因此,每个action方法都可以使用同一个类,只需要设置这个属性“tablename”。

    谢谢你的帮助,

    斯特芬

    1 回复  |  直到 12 年前
        1
  •  2
  •   James Gregory    15 年前

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

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

    可能是这样:每个插件都为这个表定义了自己的映射,这个映射派生自一个抽象类,该类包含除表名之外的实际映射。

    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");
      }
    }
    

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