Свободный nHibernate, путаница IDictionary - PullRequest
1 голос
/ 13 октября 2010

Использование следующих классов ..

public class Trait
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}
public class Sheet
{
    public virtual int Id { get; set; }
    public virtual IDictionary<Trait, int> Influences { get; set; }
}

Я попытался отобразить их, используя Fluent nHibernate, как таковой.

public class TraitMap : ClassMap<Trait>
{
    public TraitMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Table("Traits");
    }
}
public class SheetMap : ClassMap<Sheet>
{
    public SheetMap()
    {
        Id(x => x.Id);

        HasManyToMany<Trait>(x => x.Influences)
            .Schema("Sheets")
            .Table("Influences")
            .ParentKeyColumn("Trait")
            .ChildKeyColumn("Sheet")
            .AsMap<int>("Rating")
            .Cascade.All();

        Table("Sheets");
    }
}

Это не работает. Я получаю исключение.

Исключение произошло, получатель Trait.Id

Теперь, если я изменю словарь так, чтобы он выглядел следующим образом ..

public class Sheet
{
    public virtual int Id { get; set; }
    public virtual IDictionary<int, Trait> Influences { get; set; }
}

По сути, делая int Ключом, а Trait значением (а не тем, что я хочу), он работает. Может кто-нибудь объяснить это, и как я могу более адекватно воспроизвести то, что я пытаюсь сделать?

Я думаю, что причина в том, что когда я указываю HasManyToMany<Trait>, я указываю элемент Value коллекции. Однако это не мое намерение.

Я хочу искать вещи по названию ключа, а не по имени значения. Хотя я понимаю, что это технически «приемлемое» решение, оно как бы противоречит соглашению по словарю. Я предпочел бы придерживаться более общепринятого подхода к решению, если это вообще возможно - и я хотел бы лучше понять, что на самом деле происходит под капотом.

1 Ответ

2 голосов
/ 13 октября 2010

То, что вы хотите, - это то, что <composite-index> отображение в hbm дало бы вам. Я считаю, что вместо AsMap вы бы хотели AsEntityMap. Тем не менее, посмотрите на эту ветку , в которой говорится о переписывании (в августе) свободного отображения для Карт, что делает все вышеперечисленное устаревшим.

РЕДАКТИРОВАТЬ : Для AsEntityMap и других параметров, посмотрите на этот вопрос SO и ответ

  HasMany<Trait>(x => x.Influences)
    .KeyColumn("key column name")
    .AsEntityMap("referenced column name")
    .Entity("dict value", v=> v.Type<int>());

Кроме того, вы говорите, что используете последнюю версию - последняя версия - 1.1, но транк - 2.0, и он сильно отличается, и намного дальше. Если вы не пользуетесь версией 2.0+, вы не увидите методов, опубликованных в большинстве веток справки, таких как приведенная выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...