![](/img/trans.png)
[英]How to map IDictionary<string, Entity> in Fluent NHibernate
[英]Fluent nHibernate , IDictionary Confusion
使用以下類。
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設為Key,將Trait設為值(不是我想要的值),它確實可以工作。 誰能解釋一下,我如何更恰當地重現我想做的事情?
我認為這是因為當我指定
HasManyToMany<Trait>
我是在指定集合的Value元素。 但是,這不是我的意圖。
我想通過鍵的名稱而不是值的名稱來查找內容。 盡管我意識到從技術上講這是一個“可接受的”解決方案,但它與Dictionary約定背道而馳。 如果可能的話,我寧願對解決方案方法采取更常規的做法-而且我想更好地了解幕后的實際情況。
您想要的是hbm中的<composite-index>
映射會給您帶來什么。 我相信,而不是AsMap
,你想要AsEntityMap
。 但是, 請看一下該線程 , 該線程討論了8月份對Maps的流暢映射的重寫(八月份),這使得上述所有操作都已過時。
編輯 :對於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+,則不會在大多數幫助線程中看到發布的方法,例如上面鏈接的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.