2009-04-17 83 views
0

也许我做错了,但这里有云:subsonic.migrations和Oracle XE

我试图创建一个使用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) 
) 

哪一个不能在oracle上工作。正确的SQL是:

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

有趣的是,因为这是亚音速迁移执行的第一个SQL,从来没有人测试了甲骨文。

回答

1

只是胡乱猜测(我不完全了解有关精确CREATE TABLE语法用于Oracle):以“0”为默认值亚音速尝试创建一个“架构信息”表(见this,搜索private static void CreateSchemaInfo(string providerName))。它在内部使用OracleGenerator,它基本上是ANSIGenerator,所以这可能是问题所在。

+0

你是对的!我做了一步一步的调试,可以看到亚音速使用的是与oracle完全不同的SQL。谢谢! – andrecarlucci 2009-04-17 16:19:19

0

这是我的错。我没有Oracle许可,也没有关于它如何工作的一点线索。我试图做的(关于SQL生成)是使用虚拟方法生成符合ANSI的SQL(嗯,我知道 - 但一个人可以梦想),每个提供者可以根据需要调整。

Eric和其他人(使用Oracle)测试了大部分查询等 - 但您是对的 - 我们从未有机会在Oracle上测试迁移。这是我的错,我承担责任。我需要花一些时间去了解Oracle - 或者找一个愿意在这里投入更多时间的提交者。

+0

这也是亚音速存在的缺点,让我们老实说,它真的很有趣。 关于oracle,你可以下载oracle express(http://www.oracle.com/technology/products/database/xe/index.html),它是开发的免费版本,它具有你需要的所有功能。无论如何,我会看看这个,欢呼! – andrecarlucci 2009-04-17 19:18:23