2010-02-18 61 views
3

与流利的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); 
    (...) 

所以每一个动作方法可以用同一类工作,只需要设置这一个属性“表名”。

感谢您的帮助,

斯特芬

回答

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

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

+0

这是我尝试过的东西(起初失败,因时间压力而放弃)。非常感谢,我会在我的开发PC上立即检查它,并且会返回到这里;)顺便说一句,保持它! – Steffen 2010-02-18 19:53:51

+0

太棒了!它完美的作品。我用映射的通用基础类的你的想法,进口通过MEF从插件的所有模型和取得的插件库获取这样的数据: 公开名单的GetData (INT ID,字符串modelClassname)其中T:IData的 { 返回会话。在(modelClassname).Where(d => d.ObjectId == id).ToList(); } 感谢您的灵感,我会立即接受:) – Steffen 2010-02-18 22:36:24

+0

很高兴听到你得到它的工作:) – 2010-02-19 09:06:50