Ошибка Castle Activerecord: «отношение не существует» в Postgresql?

Карта ActiveRecord:

[ActiveRecord("JobTitle",Schema="public")] 
public class JobTitle :ActiveRecordValidationBase<JobTitle>
{

    [PrimaryKey(Column = "Id")]
    public virtual int Id { get; set; }

    [Property(Column = "Description")]
    public virtual string Description { get; set; }

    [Property(Column = "Title", NotNull = true)]
    public virtual string Title { get; set; }

}

введите здесь описание изображения

Подключение к БД:

введите здесь описание изображения

Конфигурация БД:

 public class DbConfig
{

    public static void Configure()
    {

        var connectionString=ConfigurationManager.ConnectionStrings["PgConnection"].ConnectionString; 
        var source = ActiveRecordSectionHandler.Build(DatabaseType.PostgreSQL82,connectionString);

        ActiveRecordStarter.Initialize(source, typeof(JobTitle)); 


    }


}

И инициализация в приложении началась:

введите здесь описание изображения

Протестируйте, например, таблицу:

    //
    // GET: /Home/
    public string Index()
    {
        var jobTitle= JobTitle.TryFind(1);

        return jobTitle.Title;
    }

Ошибка входа в активную запись:

введите здесь описание изображения

Трассировка это:

введите здесь описание изображения

Я так понимаю, что запрос ошибочный. Потому что неправильно отправляет в pg sql запрос. И этот простой запрос для моей таблицы JobTitle:

  select * from public.jobtitle => Castle Active Record
  select * from public."jobtitle" => Pg 

Как я могу решить эту проблему литья?


person Elyor    schedule 02.05.2013    source источник
comment
Вы уже изолировали причину. Если вы не можете исправить генератор запросов, просто используйте все имена таблиц в нижнем регистре, чтобы обойти это.   -  person Craig Ringer    schedule 02.05.2013
comment
Крейг Рингер - какая разница, маленькие или большие символы?, и моя проблема Замка ActiveRecord запрос к приведению Pgsql sql для exp:public.jobtitle->public."jobtitle".   -  person Elyor    schedule 02.05.2013


Ответы (2)


Идентификаторы PostgreSQL чувствительны к регистру; "JobTitle" не то же самое, что "jobtitle". Однако идентификаторы без кавычек складываются в нижний регистр. Свертывание регистра требуется стандартом SQL.

Это означает, что если вы создаете таблицу с:

CREATE TABLE "JobTitle" (...)

вы должны последовательно обращаться к нему как:

SELECT * FROM "JobTitle";

если опустить кавычки:

SELECT * FROM JobTitle;

PostgreSQL сворачивает регистр JobTitle в jobtitle, и вы получите сообщение об ошибке о том, что таблица jobtitle не существует.

Либо цитируйте последовательно, либо используйте все идентификаторы нижнего регистра.

Дополнительные сведения см. в разделе лексической структуры руководства пользователя.

person Craig Ringer    schedule 02.05.2013
comment
Хорошо, верно! Спасибо за ответ :). Моя проблема сейчас не проблема, и синтаксис pg sql использует слияние Castle ActiveRecord! - person Elyor; 02.05.2013
comment
У меня есть логика для этого класса. Здесь: [ActiveRecord("JobTitle",Schema="public")] - person Elyor; 02.05.2013
comment
@lelyor Я действительно не уверен, что ты пытаешься сказать этими комментариями. - person Craig Ringer; 02.05.2013
comment
Очень аккуратно объяснил. Самое простое решение (ИМХО) - не использовать идентификаторы CamelCase для таблиц и столбцов в postgres, а вместо этого придерживаться underscore_separated_words. - person IMSoP; 02.05.2013

У меня та же проблема, но ActiveRecordStarter.CreateSchema(); решает мою проблему. Я предполагаю, что вы должны поместить эту строку кода после инициализации ActiveRecordStarter.

person Partha Basak    schedule 07.01.2014