2009-12-21 211 views
2

我有一個實體,像這樣:如何使用Fluent NHibernate自動映射映射字典?

public class Land 
{ 
    public virtual IDictionary<string, int> Damages { get; set; } 
    // and other properties 
} 

每次我嘗試使用自動映射用下面的代碼:

var sessionFactory = Fluently.Configure() 
    .Database(SQLiteConfiguration.Standard.InMemory) 
    .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Land>)) 
    .BuildSessionFactory(); 

我收到以下錯誤:

{"The type or method has 2 generic parameter(s), but 1 generic argument(s) were 
provided. A generic argument must be provided for each generic parameter."} 

人告訴我我做錯了什麼?另外,這只是一個簡單的例子。我有更多的詞典比這個更多。

+0

http://stackoverflow.com/questions/1410716/fluentnhibernate-mapping-for-dictionary 嘗試AsMap() – 2012-09-14 16:38:23

回答

9

NHibernate是不可能的。

+0

你是否認爲這對於Fluent NHibernate automapping,Fluent NHibernate作爲一個整體(也就是流利映射的意義)或NHibernate本身是不可能的? – 2010-01-01 02:05:13

+0

NHibernate本身。我不知道任何可以自動映射字典的ORM。 – user224564 2010-01-03 06:06:28

+8

你是對的,你必須手動映射它。使用Fluent,它將是'References(x => x.Dictionary).AsMap (「keyColumn」)。Element(「valueColumn」,c => c.Type ());'。 – 2010-01-11 05:18:09

3

發現一些痕跡,這isn't possible。一些痕跡,即it's recently implemented

仍在調查中。 :)


This looks quite promising(尚未測試)。

所以,你的情況應該像=>

public class LandMap : ClassMap<Land> 
{ 
    public LandMap() 
    { 
     (...) 

     HasMany(x => x.Damages) 
      .WithTableName("Damages") 
      .KeyColumnNames.Add("LandId") 
      .Cascade.All() 
      .AsMap<string>(
       index => index.WithColumn("DamageType").WithType<string>(), 
       element => element.WithColumn("Amount").WithType<int>() 
      ); 
    } 
} 

請記住 - 這應該。我沒有測試它。

+0

這對流利的映射。我正在尋找一些適用於自動映射的功能,因爲我的所有實體中都有大約50個字典。 – 2009-12-23 23:15:29

+0

啊......對不起。不知何故,沒有注意到'automapping'。我會看一看。 :) – 2009-12-23 23:18:53

1

可能的解決方法應該與自動映射理論工作:

public class DamagesDictionary : Dictionary<string, int> 
{ 
} 

Land.cs

public class Land 
{ 
    public virtual DamagesDictionary Damages { get; set; } 
    // and other properties 
} 

或更通用的方法......

public class StringKeyedDictionary<T> : Dictionary<string, T> 
{ 
} 

Land.cs

public class Land 
{ 
    public virtual StringKeyedDictionary<int> Damages { get; set; } 
    // and other properties 
} 
+0

我認爲這是一個被低估的答案 - 有時更簡單的做另一個有2個屬性的POCO(Key,Value),並且提到如果你不能編寫映射(Lazy,yes .. Recommender,no ..但是...) – Darbio 2011-11-30 05:01:16

相關問題