2016-11-08 36 views
1

使用NHibernate和Oracle,我在訂購條件時遇到了一個問題。 說我已經得到了這些實體(及其相應的數據庫類型):NHibernate在Oracle中鑄造字符串參數

public class Contact 
{ 
    public virtual int PrimaryKey { get; set; } // number(38,0) NOT NULL 
    public virtual string Name { get; set; } // nvarchar2(max) NULL 
    public virtual int? CompanyFk { get; set; } // number(38,0) NULL 
    public virtual Company Company { get; set; } 
} 
public class Company 
{ 
    public virtual int PrimaryKey { get; set; } // number(38,0) NOT NULL 
    public virtual string Name { get; set; } // nvarchar2(max) NULL 
} 

以常規的方式映射,使得使用LINQ,我可以查詢這樣的:

var boeingEmployees = Context.Contacts.Where(c => c.Company.Name == "Boeing"); 

麻煩的開始,如果我做這樣的事情:

var query = Context.Contacts.OrderBy(c => c.Company == null ? null : c.Company.Name); 

在這種情況下,也許上面是愚蠢的,但我有多個情況下,我可能有一個條件排序依據。所以NHibernate翻譯這個是這樣的:

SELECT CONTACT.PRIMARYKEY, CONTACT.NAME, CONTACT.COMPANYFK 
FROM CONTACT 
LEFT OUTER JOIN COMPANY ON CONTACT.COMPANYFK = COMPANY.PRIMARYKEY 
ORDER BY CAST(CASE WHEN CONTACT.COMPANYFK IS NULL THEN :p0 ELSE COMPANY.NAME END AS NVARCHAR(255)) ASC; 

參數p0爲空。或者我可以讓它成爲string.Empty或「abc」。無論字符串是什麼,參數本身都是varchar2類型,而COMPANY.NAME是nvarchar2。此Oracle異常得到投擲:

ORA-12704:字符集不匹配

如果我擺弄SQL,以便排序依據是這樣的,

ORDER BY CASE WHEN CONTACT.COMPANYFK IS NULL THEN CAST(:p0 AS NVARCHAR2(255)) ELSE COMPANY.NAME END ASC 

那麼查詢工作正常。但顯然,這是NHibernate生成的代碼,我不能(我認爲)在實踐中真正改變它。

因此,少數與NHibernate和Oracle合作的問題......處理這個問題的最佳方法是什麼?有沒有方法來投射參數?或者在NHibernate中設置一個默認的字符串字符集?

謝謝

+0

可能的重複[C#??運算符和ora-12704:字符集不匹配](http://stackoverflow.com/questions/28082826/c-sharp-operator-and-ora-12704-character-set-mismatch) –

+0

@ shA.t是的,它看起來就像Select和OrderBy中的問題一樣。不同case語句中的數據類型不匹配。 – ZrSiO4

回答

0

在您的映射中使用AnsiString特定屬性。那麼你將不會有這些鑄件。

+0

似乎有點倒退,不得不改變數據庫以適應這種奇怪的怪癖。另外爲了傳統目的,我需要保持數據庫不變。 – ZrSiO4

+0

我從來沒有說過你應該改變數據庫。只需更改映射。 –