1

我使用 Fluent NHibernate 为 Oracle 数据库自动映射。My Domain 类有一些 Oracle 关键字作为属性名称。示例:组是 Oracle 中的关键字。当我们使用 Group 作为列时,它需要用引号括起来(如“Group”)。我们如何在 Fluent NHibernate 中处理这个问题?

我修改了 IColumnInstances 以添加 ColumnName 方法并添加了一个约定。添加此代码后,它会引发另一个错误“ORA-00907:缺少右括号”。有没有替代的解决方案?

这是代码

public class ColumnNameConvention : IColumnConvention
{
    public void Apply(IColumnInstance instance)
    {
        try
        {
            if (instance.Name.Length > 30)
            {
                instance.ColumnName(instance.Name.Substring(instance.Name.Length - 25, 25));
            }
            else
            {
                instance.ColumnName("\"" + instance.Name + "\"");
            }
            instance.Length(200);
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
    }
}
4

2 回答 2

2

在您的情况下使用的正确魔术符号是: ` (请参阅下面的示例以更好地理解)

在这里检查:

例子:

Map(x => x.Group).Column("`Group`");

全局设置的有趣阅读:

例子:

FluentConfiguration configuration = ...

configuration
 .ExposeConfiguration(x => x.SetProperty("hbm2ddl.keywords", "auto-quote"));

return configuration.BuildSessionFactory();

或者

SchemaMetadataUpdater.QuoteTableAndColumns(config)
于 2013-05-20T04:30:52.427 回答
0

这是工作代码。

private static ISessionFactory CreateSessionFactory()
    {
        try
        {
            var cfg = OracleClientConfiguration.Oracle10.ConnectionString(c =>
            c.Is("Data Source=XXXXXXX;User ID=XXXXX;Password=XXXX;"));

            FluentConfiguration configuration = Fluently.Configure()
                    .Database(cfg)
                    .Mappings(m => m.AutoMappings.Add(CreateAutomappings))
                    .ExposeConfiguration(x => x.SetProperty("hbm2ddl.keywords", "auto-quote"))
                    .ExposeConfiguration(BuildSchema);

            return configuration.BuildSessionFactory();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.InnerException.Message);
            throw ex;
        }
    }

请记住.. 您仍然需要将列长度限制为 30 个字符。我修改了 IColumnInstances 以添加 ColumnName 方法并添加了一个约定。这是代码

在 FluentNHibernate 的 ColumnInstance 类中添加此代码。我还添加了相应的接口方法。

 public void ColumnName(string columnname)
    {
        mapping.Set(x => x.Name, Layer.Conventions, columnname);
    }

在您的代码中添加此实现代码。

public class ColumnNameConvention : IColumnConvention, IColumnConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IColumnInspector> criteria)
    {
        criteria.Expect(x => x.Name.Length > 30);
    }

    public void Apply(IColumnInstance instance)
    {
        try
        {
            instance.ColumnName(instance.Name.Substring(instance.Name.Length - 25, 25));
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
    }
} 
于 2013-05-20T14:09:19.613 回答