2013-05-20 7 views
1

Я использовал Fluent NHibernate для автоматической карты для базы данных Oracle. В моем классе Domain есть ключевые слова Oracle как имена свойств. Пример: Группа является ключевым словом в Oracle. Когда мы используем Group в качестве столбца, она должна быть заключена в кавычки (например, «Группа»). Как мы можем позаботиться об этом в Fluent NHibernate?Fluent NHibernate - ORA-00904:: недопустимый идентификатор Поскольку имя свойства объекта является ключевым словом оракула

Я изменил IColumnInstances, чтобы добавить метод ColumnName и добавил Конвенцию. После добавления этого кода он выдает еще одну ошибку «ORA-00907: отсутствует правая скобка». Есть ли альтернативное решение?

Вот код

public class ColumnNameConvention : IColumnConvention 
{ 
    public void Apply(IColumnInstance instance) 
    { 
     try 
     { 
      if (instance.Name.Length > 30) 
      { 
       instance.ColumnName(instance.Name.Substring(instance.Name.Length - 25, 25)); 
      } 
      else 
      { 
       instance.ColumnName("\"" + instance.Name + "\""); 
      } 
      instance.Length(200); 
     } 
     catch (System.Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 

ответ

1

Правильная магия знак, который используется в вашем случае: ` (см, например, для лучшего понимания)

Проверьте это здесь:

Пример:

Map(x => x.Group).Column("`Group`"); 

Интересное чтение для глобальных настроек:

пример:

FluentConfiguration configuration = ... 

configuration 
.ExposeConfiguration(x => x.SetProperty("hbm2ddl.keywords", "auto-quote")); 

return configuration.BuildSessionFactory(); 

или

SchemaMetadataUpdater.QuoteTableAndColumns(config) 
+0

Спасибо .. Это сработало ... Я опубликую рабочий код. – Mohan

+0

Замечательно видеть это! Nhibernate - мощный инструмент ...;) –

0

Вот рабочий код.

private static ISessionFactory CreateSessionFactory() 
    { 
     try 
     { 
      var cfg = OracleClientConfiguration.Oracle10.ConnectionString(c => 
      c.Is("Data Source=XXXXXXX;User ID=XXXXX;Password=XXXX;")); 

      FluentConfiguration configuration = Fluently.Configure() 
        .Database(cfg) 
        .Mappings(m => m.AutoMappings.Add(CreateAutomappings)) 
        .ExposeConfiguration(x => x.SetProperty("hbm2ddl.keywords", "auto-quote")) 
        .ExposeConfiguration(BuildSchema); 

      return configuration.BuildSessionFactory(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.InnerException.Message); 
      throw ex; 
     } 
    } 

Помните, что вам необходимо ограничить длину столбца до 30 символов. Я изменил IColumnInstances, чтобы добавить метод ColumnName и добавил Конвенцию. Вот код для этого

Добавить этот код в Класс ColumnInstance FluentNHibernate. Я также добавил соответствующие методы интерфейса.

public void ColumnName(string columnname) 
    { 
     mapping.Set(x => x.Name, Layer.Conventions, columnname); 
    } 

Добавить код реализации в свой код.

public class ColumnNameConvention : IColumnConvention, IColumnConventionAcceptance 
{ 
    public void Accept(IAcceptanceCriteria<IColumnInspector> criteria) 
    { 
     criteria.Expect(x => x.Name.Length > 30); 
    } 

    public void Apply(IColumnInstance instance) 
    { 
     try 
     { 
      instance.ColumnName(instance.Name.Substring(instance.Name.Length - 25, 25)); 
     } 
     catch (System.Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 

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

  • Нет связанных вопросов^_^