2012-03-17 33 views
2

關於流暢的nHibernate表映射的問題:FluentNhibernate和表/列名大寫字母保存和轉義?

顯然,我錯誤地認爲,使用ORM工具(如nHibernate)可以獲得數據庫獨立性 - 至少在創建表時。

現在,我有一個自動化工具(http://nmg.codeplex.com),它爲我創建了流暢的nHibernate映射。 (雖然只有當所有的表有一個主鍵...)

這裏這種映射一個很好的代表例子,因爲它是由程序

public class ELMAH_ErrorMap : ClassMap<ELMAH_Error> 
{ 

    public ELMAH_ErrorMap() 
    { 
     Table("ELMAH_Error"); 
     LazyLoad(); 
     Id(x => x.ErrorId).GeneratedBy.Assigned().Column("ErrorId"); 
     Map(x => x.Application).Column("Application").Not.Nullable().Length(60); 
     Map(x => x.Host).Column("Host").Not.Nullable().Length(50); 
     Map(x => x.Type).Column("Type").Not.Nullable().Length(100); 
     Map(x => x.Source).Column("Source").Not.Nullable().Length(60); 
     Map(x => x.Message).Column("Message").Not.Nullable().Length(500); 
     Map(x => x.User).Column("User").Not.Nullable().Length(50); 
     Map(x => x.StatusCode).Column("StatusCode").Not.Nullable(); 
     Map(x => x.TimeUtc).Column("TimeUtc").Not.Nullable(); 
     Map(x => x.Sequence).Column("Sequence").Not.Nullable(); 
     Map(x => x.AllXml).Column("AllXml").Not.Nullable().Length(1073741823); 
    } 
} 

顯然,問題#創建 它也能正常工作1是這一行

Map(x => x.User).Column("User").Not.Nullable().Length(50); 

因爲用戶是MS-SQL(以及postgre)中的受保護關鍵字。 因此模式導出失敗,並在「用戶」附近出現語法錯誤。

現在,很明顯這是可解的由相應的轉義字符包圍列(或表)名稱([]爲MS-SQL 「」 對PostgreSQL)

因此,我改變

Map(x => x.User).Column("User").Not.Nullable().Length(50); 

Map(x => x.User).Column("[User]").Not.Nullable().Length(50); 

它工作正常。

然後在PostGre,我不得不改變

Map(x => x.User).Column("[User]").Not.Nullable().Length(50); 

Map(x => x.User).Column("\"User\"").Not.Nullable().Length(50); 

因爲postgre使用該其他轉義序列...

所以,現在,我必須創建每個數據庫系統的單獨映射? (MySQL有另一個轉義字符以及...,想知道FireBird使用什麼) ARGH?!?

這同樣存在另一個問題: 對於未用引號enlosed每個表&列,PostGre更改表/列名小寫,這是「精」(但不僅因爲它是不大小寫敏感),但如果名稱包含在引號中,則區分大小寫...

然後,我確實有大約200個視圖端口... 我實際上並不想寫一個解析器只是將每個視圖的每一列(以及表和視圖名稱)包含在任何數據庫使用的任何引號中...

有沒有辦法告訴流利/ nHibern吃掉了我的列名&(總是,但最好只在必要時)?

有趣的是,我自己的數據庫實際上並不是問題(我用T_和每個列都添加了一些表ID)前綴所有200個表,問題是所有那些蹩腳的第三方組件(如ELMAH或會話/會員提供商等),這些人已經寫過...... [自我審查]

回答

2

也許你沒有設置屬性hbm2ddl.keywords(應該通過deafult)。

試試看來自Fabio Maulo的this post

+0

其實,你的文章說默認關閉。但是,謝謝,「SchemaMetadataUpdater.QuoteTableAndColumns(config);」是所有必要的魔法。 – 2012-03-17 13:13:00

+0

你說得對。我的錯誤;)無論如何,我很高興它幫助 – Iridio 2012-03-17 14:58:55

+0

只是想補充說,這需要nHibernate 3.2。否則它會在PostGre上拋出異常。它不適用於默認情況下(此時)流暢使用的3.1。 – 2012-04-05 09:48:31

相關問題