1

如果我有一个映射 id 的约定,这就是我通常使用 hilo 生成器对具有 int Id 列的 int Id 属性进行映射的方式:

public class IdConvention : IIdConvention
{
    private const int HiLoRange = short.MaxValue;

    public void Apply(IIdentityInstance instance)
    {
        instance.Column(instance.EntityType.Name + "Id");
        instance.GeneratedBy.HiLo(HiLoRange.ToString());
    }
}

但是我有一个我想以不同方式映射的类,而是使用分配的字符串作为 Id,我使用了覆盖:

public class SomeClassMapping : IAutoMappingOverride<SomeClass>
{
    public void Override(AutoMapping<SomeClass> mapping)
    {
        mapping.Id(instance => instance.StringProperty).GeneratedBy.Assigned().Column("StringProperty");
    }
}

这在旧版本的 FluentNHibernate/NHibernate 中有效,但是当我更新到 1.3.0.733/3.3.2.4000 时,我现在成为未处理异常的受害者:

System.InvalidOperationException:标识类型必须是整数(int、long、uint、ulong)

仅当我尝试使用字符串(或其他一些非整数属性作为 Id)时才会发生这种情况,我是否应该期望我不再能够覆盖映射并提供不同的生成器和类型,或者有什么在一般情况下,我可以做不同的事情来隐藏我想要做的覆盖吗?

4

1 回答 1

3

看起来执行顺序改变了。一个简单的解决方法是

public void Apply(IIdentityInstance instance)
{
    if (instance.Type == typeof(int))
    {
        instance.Column(instance.EntityType.Name + "Id");
        instance.GeneratedBy.HiLo(HiLoRange.ToString());
    }
}
于 2013-01-22T05:40:32.097 回答