1

IDをマッピングするための規則がある場合、これは、intId列を持つintIdプロパティでhilogeneratiorを使用する一般的なマッピング方法です。

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:IDタイプは整数である必要があります(int、long、uint、ulong)

これは、文字列(またはIDとして他の非整数プロパティ)を使用しようとしている場合にのみ発生します。マッピングをオーバーライドして別のジェネレーターとタイプを指定することができなくなると予想される場合、または何かありますか一般的なケースでhiloを実行したいオーバーライドを非表示にするために、別の方法で実行できますか?

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 に答える