2012-04-10 3 views
0

Я заметил, что параметр default_schema работает только для сгенерированного SQL. Пользовательский SQL (в моем случае: через Map(). Формула()) не имеет значения по умолчанию default_schema.fluentnhibernate: default_schema и Formula

Есть ли способ обойти это? Я пробовал наивный подход, пытаясь прочитать default_schema из конфигурации в классе сопоставления, а затем сменить SQL в вызове .Formula(), чтобы включить default_schema, но даже , обращаясь к конфигурации из сопоставления -файл кажется нетривиальным.

Любая помощь была бы принята с благодарностью!

С уважением, LDX

ответ

0

Я решил это сам.

Поскольку невозможно получить доступ к любой конфигурации в ClassMap (и я не хотел начинать читать файлы конфигурации вручную там), и поскольку у вас не может быть зависимостей, введенных в ClassMap через некоторую среду IoC (Classmaps необходимо конструктор без параметров), я должен был сделать его "старинку" с одноплодным классом:

Одноэлементные:

общественного класс DefaultSchemaProvider { частными статический DefaultSchemaProvider _instance = NULL; приватная строка _defaultSchema = null;

public static DefaultSchemaProvider Instance 
{ 
    get 
    { 
     if (_instance == null) 
      _instance = new DefaultSchemaProvider(); 
     return _instance; 
    } 
} 

public void SetDefaultSchema(string defaultSchema) 
{ 
    _defaultSchema = defaultSchema; 
} 

public string GetDefaultSchema() 
{ 
    return _defaultSchema; 
} 

}

В процессе конфигурирования:

var nhibernateCfg = new NHibernate.Cfg.Configuration(); 
nhibernateCfg.Configure(ConfigurationFile); 
DefaultSchemaProvider.Instance.SetDefaultSchema(nhibernateCfg.GetProperty("default_schema")); 

в classmap:

public class CustomerMap : ClassMap<Customer> 
{ 
    public CustomerMap() 
    { 
     var defaultSchema = DefaultSchemaProvider.Instance.GetDefaultSchema() + "."; 

     Table("Customers"); 

     Id(x => x.Id).Column("Customer_id"); 
     Map(x => x.Description).Column("Name"); 
     Component(c => c.CustomerType, c => 
     { 
      c.Map(x => x.Id).Column("Customer_type");   
      c.Map(x => x.Description).Formula(
       "(SELECT ct.value FROM " + defaultSchema + "customer_types ct WHERE ct.field='description' AND ct.typeid = Customer_type)"); 
     }); 
     HasMany(x => x.ArticleLinks).KeyColumn("VENR").Access.CamelCaseField(Prefix.Underscore); 
    }     
} 
+0

в случае, если кто приходит сюда, можно иметь classmaps с constructorparameters. 'var model = new PersistenceModel(); model.Add (новый MyClassMap (someparameter)); Свободно ... Отображения (m => m.UsePersistenceModel (model) ...) ' – Firo

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