我正在将一些映射从流畅的映射范例更新为自动映射范例。我有一个名为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方法不接受序列名称字符串,就像它在流畅映射中一样。有没有人对如何最好地解决这个问题有任何建议?
谢谢!
答案 0 :(得分:1)
GeneratorInstance.cs文件已包含以下方法的实现:
void Native(string sequenceName);
void Native(string sequenceName, Action<ParamBuilder> paramValues);
这些方法未在IGeneratorInstance.cs接口中公开。我继续添加它们,这使我能够创建我需要的主键约定。我尽可能地告诉他们工作正常。不幸的是,我公司的IT安全组已经认为可以在他们的防火墙上关闭一堆端口,这阻止了我通过github提供回馈。所以,如果有人想为我提交更新,我将不胜感激。
谢谢!