0

私はテーブルを持っています:

プレイヤー
ID: int - 主キー
名: 文字列

BowlerType
Id : int - primarykey
説明 : string

PlayerBowlerType
PlayerId : Player.Id を参照する
int が null でない外部キー

プレイヤーは多くのボウリングの種類を確認できます。ここにいくつかのサンプルデータがあります

プレーヤー
1 | ピーター
2 | ジョン

ボウラータイプ
6 | スロー
7 | 速い

PlayerBowlerType
1 | 6
1 | 7
2 | 7

4

2 に答える 2

1

ここで必要なのは、PlayerBowlerType で使用する複合 ID です。このセットアップは機能するはずです:

public class PlayerBowlerTypeId
{
    public virtual int PlayerId { get; set; }

    public virtual int BowlerTypeId { get; set; }

    public override bool Equals(object obj)
    {
        return Equals(obj as PlayerBowlerTypeId);
    }

    private bool Equals(PlayerBowlerTypeId other)
    {
        if (ReferenceEquals(other, null)) return false;
        if (ReferenceEquals(this, other)) return true;

        return PlayerId == other.PlayerId &&
            BowlerTypeId == other.BowlerTypeId;
    }

    public override int GetHashCode()
    {
        unchecked 
        {
            int hash = GetType().GetHashCode();
            hash = (hash * 31) ^ PlayerId.GetHashCode();
            hash = (hash * 31) ^ BowlerTypeId.GetHashCode();

            return hash;
        }
    }
}

public class PlayerBowlerType
{
    public PlayerBowlerType()
    {
        Id = new PlayerBowlerTypeId();
    }

    public virtual PlayerBowlerTypeId Id { get; set; }
}

public class PlayerBowlerTypeMap : ClassMap<PlayerBowlerType>
{
    public PlayerBowlerTypeMap()
    {
        Table("TABLENAME");

        CompositeId<PlayerBowlerTypeId>(x => x.Id)
            .KeyProperty(x => x.BowlerTypeId, "COLUMNNAME")
            .KeyProperty(x => x.PlayerId, "COLUMNNAME");
    }
}

技術的にはアイデンティティ オブジェクトなしでこれを行うことができます (PlayerBowlerTypeId 型は削除され、コードは PlayerBowlerType に直接配置され、適切に調整されます) が、これを行うことによって引き起こされるいくつかの問題 (3-4 の個別のバグ) がありました。そのうちの 1 つをここで説明します。

ORM システムのバグを補うためにドメイン オブジェクトを変更するのは嫌いですが、PlayerBowlerTypeId 型を使用するだけで、多くの頭痛の種から解放されます。

実際のテーブル名と列名を使用するようにマッピングを変更する限り、これは機能するはずです (および特定のセットアップのマッピングで行う必要があるその他すべて)。

于 2011-12-11T18:47:42.557 に答える
0

HasManytoMany を使用できると思います。要件に基づいて、プレイヤーとボウラーのタイプの ID を含むテーブルを作成する必要があります。これには多対多の関係があります。

このサイトを見る場合: https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started Store と Products のマッピングは、意図したマッピングと同じです。 ここに画像の説明を入力

于 2013-08-17T11:02:39.183 に答える