2010-02-18 4 views
3

с плавным nhibernate, есть ли способ динамически переключать таблицу отображения во время выполнения?Fluent 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».

Спасибо за любую помощь,

Штеффен

ответ

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

Это то, что я пробовал (сначала потерпел неудачу и сдался из-за давления по расписанию). Большое спасибо, я проверю его, как только я на своем ПК разработки и вернусь сюда;) Отличная работа, держите это! – Steffen

+0

Фантастический! Он работает отлично. Я использовал вашу идею отображения общего базовый класса, импортировать все модели из плагин через MEF и сделал хранилище плагина выборки данных, как это: публичного списка GetData (интермедиат идентификатор, строка modelClassname), где T: IDATA { return session.Linq (modelClassname) .Where (d => d.ObjectId == id) .ToList(); } Спасибо за ваше вдохновение, я немедленно приму :) :) – Steffen

+0

Рад слышать, что у вас это работает :) –

Смежные вопросы