關於流暢的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或會話/會員提供商等),這些人已經寫過...... [自我審查]
其實,你的文章說默認關閉。但是,謝謝,「SchemaMetadataUpdater.QuoteTableAndColumns(config);」是所有必要的魔法。 – 2012-03-17 13:13:00
你說得對。我的錯誤;)無論如何,我很高興它幫助 – Iridio 2012-03-17 14:58:55
只是想補充說,這需要nHibernate 3.2。否則它會在PostGre上拋出異常。它不適用於默認情況下(此時)流暢使用的3.1。 – 2012-04-05 09:48:31