Свободное отображение внешнего ключа Nhibernate - PullRequest
0 голосов
/ 10 декабря 2011

У меня есть таблицы:

Игрок
Id: int - primarykey
Имя: строка

BowlerType
Id: int - первичный ключ
Описание: строка

PlayerBowlerType
PlayerId: int не нулевой внешний ключ, ссылающийся на Player.Id
BowlerTypeId: int не нулевой внешний ключ, ссылающийся на BowlerType.Id

Игрок может подтвердить множество типов боулинга. Вот некоторые примеры данных

Игрок
1 | Питер
2 | Джон

BowlerType
6 | Медленный
7 | Быстро

PlayerBowlerType
1 | 6
1 | 7
2 | 7

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Здесь вам нужен составной идентификатор для использования с вашим PlayerBowlerType.Эта настройка должна работать:

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 отдельных ошибок), вызванных этим.Один из них обсуждается здесь .

Хотя я ненавижу менять доменные объекты для компенсации ошибок в системе ORM, если вы просто используете тип PlayerBowlerTypeId, это сэкономит вам многоголовные боли.

Это должно работать до тех пор, пока вы изменяете отображение, чтобы использовать ваши фактические имена таблиц и столбцов (и все, что вам нужно сделать с отображением для вашей конкретной настройки).

0 голосов
/ 17 августа 2013

Я думаю, что мы можем использовать HasManytoMany. Исходя из ваших требований, вам нужно будет создать таблицу, содержащую идентификаторы типа игрока и боулера. Это имеет отношение ко многим.

Если вы посмотрите на этот сайт: https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started Сопоставление для Магазина и Продуктов совпадает с вашим предполагаемым сопоставлением. enter image description here

...