0

新しいオブジェクトが追加されたときに自動インクリメントするデータベースの主キーとして使用したい C# のオブジェクトがあります。このオブジェクトは基本的に ulong 値のラッパーであり、値の一部を追加のヒントとして使用します。データベースに「純粋な」 ulong 値として保存したいのですが、値が DB からロード/アンロードされるときに自動変換が必要です。IE、元のテーブルに基づいて値に「ヒント」ビットを適用します。

オンラインで見つけた多くの例に基づいて、独自の IUserType オブジェクトを実装する旅に出ました (このフォーラムにはたくさんのヘルプがあります)。

オブジェクトIDとして機能するObjectIdクラスがあります

class ObjectIdType: IUserType
{
    private static readonly NHibernate.SqlTypes.SqlType[] SQL_TYPES = { NHibernateUtil.UInt64.SqlType };

    public NHibernate.SqlTypes.SqlType[] SqlTypes
    {
        get { return SQL_TYPES; }
    }

    public Type ReturnedType
    {
        get { return typeof(ObjectId); }
    }

    ...
}

次のようなマッピング クラスがあります。

public class ObjectTableMap()
{ 
    Id(x => x.Id)
    .Column("instance_id")
            .CustomType<ObjectIdType>()
            .GeneratedBy.Native();
}

この時点で、構成で Id は整数にしかできないという例外が発生します。それは理にかなっていると思いますが、カスタム型を実装すると、ネイティブの ulong データベース型が引き継がれて機能することを半分期待していました。

カスタムジェネレーターを作成する道をたどろうとしましたが、それでも私のスキルレベルから少し外れているので、つまずいています。

私の質問は、私がマッピングでやろうとしていることを達成することは可能ですか?

4

1 に答える 1

0

あなたのマッピングはIdにネイティブジェネレーターを使用しているため、不可能だと思います。これは、整数型 (および GUID) にのみ使用できます。割り当てられた Id をカスタム タイプで使用することができるため、Id プロパティに値を割り当てる必要があります。

別の選択肢があります。テーブルに応じてではなく、クラスレベルで情報ビットを設定しないのはなぜですか? エンティティはテーブルを表すため、エンティティ クラスには同じ情報が含まれている必要があります。例:

class Entity
{
    protected virtual ulong InternalId { get; set; } // Mapped as Id

    public virtual ulong Id                          // This property is not mapped
    {
        get
        {
            var retVal = InternalId;
            // Flip your hint bits here based on class information
            return retVal;
        }
    }
}

また、InternalId をパブリック プロパティにして、setter を保護することもできます。

于 2012-12-22T14:11:46.520 に答える