2013-05-20 39 views
1

我已經使用Fluent NHibernate自動映射Oracle數據庫。我的域類有一些Oracle關鍵字作爲屬性名稱。示例:組是Oracle中的關鍵詞。當我們使用Group作爲列時,它需要用引號括起來(比如「Group」)。我們如何在Fluent NHibernate中處理這個問題?流利的NHibernate - ORA-00904::無效的標識符因爲對象屬性名稱是一個oracle關鍵字

我修改了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方法並添加了一個約定。以下是該代碼

將此代碼添加到FluentNHibernate的ColumnInstance類中。我還添加了各自的接口方法。

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; 
     } 
    } 
} 
相關問題