Fluent nhibernate FluentNHibernate-使用不同的Id生成器和类型重写IIdConvention会产生异常

Fluent nhibernate FluentNHibernate-使用不同的Id生成器和类型重写IIdConvention会产生异常,fluent-nhibernate,fluent-nhibernate-mapping,Fluent Nhibernate,Fluent Nhibernate Mapping,如果我有一个映射Id的约定,这就是我通常映射的方式,在具有int Id列的int Id属性上使用hilo Generator: public class IdConvention : IIdConvention { private const int HiLoRange = short.MaxValue; public void Apply(IIdentityInstance instance) { instance.Column(instance.En

如果我有一个映射Id的约定,这就是我通常映射的方式,在具有int Id列的int Id属性上使用hilo Generator:

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");
    }
}
public类SomeClassMapping:IAutoMappingOverride
{
公共无效替代(自动映射)
{
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)时,如果我不再能够重写映射并提供不同的生成器和类型,或者,在一般情况下,我是否可以采取一些不同的措施来隐藏我想要执行的覆盖?

看起来执行顺序已经改变。一个简单的解决办法是

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

谢谢你。我在发布了这个问题后也提出了这个解决方案(尽管可能希望包含long、uint、ulong以获得更一般的解决方案)。我希望我只是做错了什么,重写实际上仍然会重写使用hilo的尝试。我认为检查(instance.Generator.EntityType==null)更可靠,因为它只有在GeneratedBy不是由映射设置的情况下才会通过。FluentNHibernate使用分层配置,因此它将使用“在映射中定义”?“约定”?“默认值”其中“?”表示“如果存在”