Использование следующих классов ..
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 коллекции. Однако это не мое намерение.
Я хочу искать вещи по названию ключа, а не по имени значения. Хотя я понимаю, что это технически «приемлемое» решение, оно как бы противоречит соглашению по словарю. Я предпочел бы придерживаться более общепринятого подхода к решению, если это вообще возможно - и я хотел бы лучше понять, что на самом деле происходит под капотом.