如何编写使用序列的自动映射约定

时间:2011-05-10 17:58:03

标签: fluent-nhibernate

我正在将一些映射从流畅的映射范例更新为自动映射范例。我有一个名为Group的类,其中identity列的当前流畅映射如下所示:

Id(x => x.Id, "ID")
    .GeneratedBy
    .Native("GROUPS_SEQ");

导致HBM看起来像这样:

<id name="Id" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="ID" />
  <generator class="native">
    <param name="sequence">GROUPS_SEQ</param>
  </generator>
</id>

这适用于我们的Oracle数据库和使用SQLite的测试。不幸的是,我无法弄清楚如何创建一个能给我相同结果的IIdConvention约定。我已经走到了这一步:

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)
    {
        string pluralized = Inflector.Net.Inflector.Pluralize(instance.EntityType.Name);
        string underscored = Inflector.Net.Inflector.Underscore(pluralized);
        string uppercased = underscored.ToUpper();

        string sequenceName = string.Format("{0}_SEQ", uppercased);

        instance.Column("Id");
        instance.UnsavedValue("0");
        instance.GeneratedBy.Native(sequenceName);
    }
}

不幸的是,最后一行导致编译错误,因为.Native方法不接受序列名称字符串,就像它在流畅映射中一样。有没有人对如何最好地解决这个问题有任何建议?

谢谢!

1 个答案:

答案 0 :(得分:1)

GeneratorInstance.cs文件已包含以下方法的实现:

void Native(string sequenceName);
void Native(string sequenceName, Action<ParamBuilder> paramValues);

这些方法未在IGeneratorInstance.cs接口中公开。我继续添加它们,这使我能够创建我需要的主键约定。我尽可能地告诉他们工作正常。不幸的是,我公司的IT安全组已经认为可以在他们的防火墙上关闭一堆端口,这阻止了我通过github提供回馈。所以,如果有人想为我提交更新,我将不胜感激。

谢谢!