subsonic.migrations и Oracle XE - PullRequest
       9

subsonic.migrations и Oracle XE

0 голосов
/ 17 апреля 2009

Вероятно, я что-то не так делаю, но здесь идет речь:

Я пытаюсь создать базу данных с использованием subsonic.migrations в OracleXE версии 10.2.0.1.0. У меня установлен ODP v 10.2.0.2.20.

Это мой app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>
  </configSections>

  <connectionStrings>
    <add name="test" connectionString="Data Source=XE; User Id=test; Password=test;"/>
  </connectionStrings>

  <SubSonicService defaultProvider="test">
    <providers>
      <clear/>
      <add name="test" type="SubSonic.OracleDataProvider, SubSonic" connectionStringName="test" generatedNamespace="testdb"/>
    </providers>
  </SubSonicService>

</configuration>

И это моя первая миграция:

public class Migration001_Init : Migration {

        public override void Up() {

            //Create the records table
            TableSchema.Table records = CreateTable("asdf");
            records.AddColumn("RecordName");
       }

        public override void Down() {
            DropTable("asdf");
        }
    }

Когда я запускаю sonic.exe, я получаю следующее исключение:

Setting ConfigPath: 'App.config'
Building configuration from D:\Users\carlucci\Documents\Visual Studio 2008\Projects\Wum\Wum.Migration\App.config
Adding connection to test
ERROR: Trying to execute migrate
Error Message: System.Data.OracleClient.OracleException: ORA-02253: especifica‡Æo de restri‡Æo nÆo permitida aqui

   at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
   at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
   at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
   at System.Data.OracleClient.OracleCommand.ExecuteNonQuery()
   at SubSonic.OracleDataProvider.ExecuteQuery(QueryCommand qry) in D:\@SubSonic\SubSonic\SubSonic\DataProviders\OracleDataProvider.cs:line 350
   at SubSonic.DataService.ExecuteQuery(QueryCommand cmd) in D:\@SubSonic\SubSonic\SubSonic\DataProviders\DataService.cs:line 544
   at SubSonic.Migrations.Migrator.CreateSchemaInfo(String providerName) in D:\@SubSonic\SubSonic\SubSonic.Migrations\Migrator.cs:line 249
   at SubSonic.Migrations.Migrator.GetCurrentVersion(String providerName) in D:\@SubSonic\SubSonic\SubSonic.Migrations\Migrator.cs:line 232
   at SubSonic.Migrations.Migrator.Migrate(String providerName, String migrationDirectory, Nullable`1 toVersion) in D:\@SubSonic\SubSonic\SubSonic.Migrations\Migrator.cs:line 50
   at SubSonic.SubCommander.Program.Migrate() in D:\@SubSonic\SubSonic\SubCommander\Program.cs:line 264
   at SubSonic.SubCommander.Program.Main(String[] args) in D:\@SubSonic\SubSonic\SubCommander\Program.cs:line 90
Execution Time: 379ms

Что я делаю не так?

Большое спасибо за любую помощь:)

Андре Карлуччи

UPDATE: Как указал Антон, проблема заключается в дозвуковом OracleSqlGenerator. Он пытается создать таблицу схемы, используя этот sql:

CREATE TABLE SubSonicSchemaInfo (
       version int NOT NULL CONSTRAINT DF_SubSonicSchemaInfo_version DEFAULT (0)
)

Что не работает на оракуле. Правильный sql будет:

CREATE TABLE SubSonicSchemaInfo (
  version int DEFAULT (0),
  constraint DF_SubSonicSchemaInfo_version primary key (version)
)

Самое смешное, что поскольку это самый первый sql, выполняемый дозвуковыми миграциями, никто и никогда не проверял его на оракуле.

Ответы [ 2 ]

1 голос
/ 17 апреля 2009

Просто дикая догадка (я точно не знаю точный синтаксис CREATE TABLE для Oracle): SubSonic пытается создать таблицу "Информация о схеме" (см. this , поиск private static void CreateSchemaInfo(string providerName)) со значением "0" является значением по умолчанию. Внутренне он использует OracleGenerator, который в основном является ANSIGenerator , так что это может быть проблемой.

0 голосов
/ 17 апреля 2009

Это моя вина. У меня нет лицензии на Oracle, и я не имею ни малейшего понятия о том, как она работает. То, что я пытался сделать (в отношении генерации SQL), - это создать базовый класс, который генерирует ANSI-совместимый SQL (да, я знаю, но парень может мечтать) с виртуальными методами, которые каждый поставщик может настроить по мере необходимости.

Эрик и другие (использующие Oracle) протестировали большинство запросов и т. Д., Но вы правы - у нас никогда не было возможности протестировать миграции на Oracle. Это моя вина, и я беру на себя ответственность. Мне нужно некоторое время, чтобы познакомиться с Oracle - или найти коммиттера, готового посвятить больше времени здесь.

...