FluentNHibernate - 使用不同的Id生成器和类型覆盖IIdConvention会产生异常

时间:2013-01-21 18:29:31

标签: fluent-nhibernate fluent-nhibernate-mapping

如果我有一个映射id的约定,那就是我通常使用int Id列在int Id属性上使用hilo generatior的映射:

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)时,才会发生这种情况,我希望我不再能够覆盖映射并提供不同的生成器和类型,或者有什么我可以做的不同,使覆盖隐藏,我想在一般情况下做hilo?

1 个答案:

答案 0 :(得分:3)

看起来执行顺序发生了变化。

是一个简单的解决方法
public void Apply(IIdentityInstance instance)
{
    if (instance.Type == typeof(int))
    {
        instance.Column(instance.EntityType.Name + "Id");
        instance.GeneratedBy.HiLo(HiLoRange.ToString());
    }
}