2016-11-08 5 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); 

В этом контексте, может быть выше, это глупо, но у меня есть несколько случаев, когда я могу иметь условный OrderBy. Так что 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, так что OrderBy выглядит так,

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 vs OrderBy. Типы данных в разных случаях не совпадают. – ZrSiO4

ответ

0

Используйте AnsiString в вашем картографирования для этого определенного свойства. Тогда у вас не будет этих отливок.

+0

Кажется немного назад, чтобы изменить базу данных, чтобы удовлетворить эту странную причуду. Плюс для устаревших целей мне нужно сохранить базу данных нетронутой. – ZrSiO4

+0

Я никогда не говорил, что вы должны изменить базу данных. Просто измените отображение. –