Orchard修改支持Oracle数据库,具体参考http://orchard.codeplex.com/discussions/401440,同时结合自己实际操作,现在已经能成功运行。
具体步骤如下:
1、准备数据库
Orcale数据库不支持数据自增,因此要使用id自动增加就需要建立序列在每次插入数据的时候就要获取序列一次。
Execute SQL query: create sequence hibernate_sequence
2、限制标识符长度。Oracle中标识符(表名和列名)不能超过30个字符。
a)确保自定义模块中的数据库记录的所有字段名不超过30个字符;
b)替换“ContentFieldDefinitionRecord”为“ContentFieldDefRecord”;
在以下文件中:
src\Orchard.Tests.Modules\Widgets\Services\WidgetsServiceTest.cs
src\Orchard.Web\Core\Settings\Metadata\ContentDefinitionManager.cs
src\Orchard.Web\Core\Settings\Metadata\Records\ContentFieldDefinitionRecord.cs
src\Orchard.Web\Core\Settings\Metadata\Records\ContentPartFieldDefinitionRecord.cs
src\Orchard.Web\Core\Settings\Migrations.cs
src\Orchard.Core.Tests\Settings\Metadata\ContentDefinitionManagerTests.cs
c)创建一个实用工具类,将所有的表名变短。(在我的项目,在类TableAliasGenerator中有一个返回唯一表别名的函数);
在我实际操作过程中,只是简单采用截取30个字符(因为我试验发现好像Orchard中,有两个表名到第29个字符才不一样,同时这样截取是不能再加前缀,否则字数将超过30。)
d) 使用TableAliasGenerator。
i. Orchard.Setup.Services.SetupService.Setup function:
var tableName = TableAliasGenerator.Generate(tablePrefix + "Settings_ShellDescriptorRecord");
ii. (Orchard.Framework)Orchard.Data.Migration.Schema.SchemaBuilder. Aplly it in all statements like this:
CreateTableCommand(TableAliasGenerator.Generate(String.Concat(_formatPrefix(_featurePrefix), name)));
iii. (Orchard.Framework)Orchard.Environment.ShellBuilders.CompositionStrategy.BuildRecord function:
return new RecordBlueprint {
Type = type,
Feature = feature,
TableName = TableAliasGenerator.Generate(dataTablePrefix + extensionName + '_' + type.Name);
}
3、使所有列名变为大写。Oracle数据库在执行“select”时,所有列名是转换为大写字母执行的。因此Orchard里定义的列名是不能在Oracle中访问的。
private string columnName;
public string ColumnName
{
get { return columnName; }
set { columnName = value.ToUpper(); }
}
4、给标识符添加引号。
修改Orchard.Data.Migration.Interpreters.DefaultDataMigrationInterpreter.Visit(CreateTableCommand command) function:
builder.Append(_dialect.PrimaryKeyString) .Append(" ( ") .Append(String.Join(", ", primaryKeys.Select(key => "\"" + key + "\"").ToArray())) .Append(" )");
5、在所有'create table'查询中,将“NVARCHAR2”数据类型改为“VARCHAR2”。在Orchard中有些列是NVARCHAR2(2048)类型,但是在Oracle中限制为NVARCHAR2(2000),因此采用VARCHAR2替代NVARCHAR2。
在Orchard.Data.Migration.Interpreters.DefaultDataMigrationInterpreter.GetTypeName function末尾添加:
if (_dialect is NHibernate.Dialect.Oracle9iDialect)
{
result = result.Replace("NVARCHAR2", "VARCHAR2");
}//result - is a return value
6、替换“Number”为“Number_”。因为在Oracle数据库中,“Number”是保留字。
在以下文件中:
Orchard.ContentManagement.Records.ContentItemVersionRecord
Orchard.ContentManagement.DataMigrations.FrameworkDataMigration
Orchard.Tests.ContentManagement.DefaultContentManagerTests
Orchard.ContentManagement.ContentItem
Orchard.ContentManagement.DefaultContentManager
7、Oracle数据库不支持空字符串,将空字符串认为是null。
修改 Orchard.Alias.Implementation.Updater.AliasHolderUpdater.Refresh function:
_aliasHolder.SetAliases(aliases