2009-05-29 71 views
0

這是可能的...流利的NHibernate映射組件參照

MessageMap() 
{ 
    Id(x => x.Id);  
    HasMany(x => x.Folders) 
        .Component(c => 
           { 
            c.Map(x => x.Name); 
            c.References(x => x.User); 
           }) 
        .Cascade.AllDeleteOrphan() 
        .Access.AsCamelCaseField(Prefix.Underscore); 
} 

public class Message 
{ 
    public virtual int Id {get; protected set;} 
    public virtual ICollection<Folder> Folders{get; protected set;} 
} 

public class Folder 
{ 
    public virtual string Name{get;set;} 
    public virtual User User{get;set;} 
} 

通過上述映射我得到下面的異常...

System.IndexOutOfRangeException: Index was outside the bounds of the array. 
[IndexOutOfRangeException: Index was outside the bounds of the array.] 
    NHibernate.Mapping.Column.set_Name(String value) +80 
    NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindColumns(XmlNode node, SimpleValue model, Boolean isNullable, Boolean autoColumn, String propertyPath) +626 
    NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindManyToOne(XmlNode node, ManyToOne model, String defaultColumnName, Boolean isNullable) +33 
    NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindComponent(XmlNode node, Component model, Type reflectedClass, String className, String path, Boolean isNullable) +987 
    NHibernate.Cfg.XmlHbmBinding.CollectionBinder.BindCollectionSecondPass(XmlNode node, Collection model, IDictionary`2 persistentClasses) +1659 
    NHibernate.Cfg.XmlHbmBinding.<>c__DisplayClassd.<AddCollectionSecondPass>b__c(IDictionary`2 persistentClasses) +33 
    NHibernate.Cfg.Configuration.SecondPassCompile() +118 
    NHibernate.Cfg.Configuration.GenerateDropSchemaScript(Dialect dialect) +44 
    NHibernate.Tool.hbm2ddl.SchemaExport..ctor(Configuration cfg, IDictionary`2 connectionProperties) +53 
    NHibernate.Tool.hbm2ddl.SchemaExport..ctor(Configuration cfg) +9 

回答

0

我覺得你的組件應該在映射Folder對象的映射。正如所寫的,它看起來像你試圖添加一個組件到文件夾集合中,這是沒有意義的。我很驚訝這編譯。

+0

對不起,我編輯了這個問題以提供更多信息。 – Oll 2009-05-29 12:41:49

1

問題出在c.Map(x => x.Name)c.References(x => x.User)。 lambda應該使用c,因爲這是組件類。

Id(x => x.Id);  
HasMany(x => x.Folders) 
       .Component(c => 
          { 
           c.Map(c => c.Name); 
           c.References(c => c.User); 
          }) 
       .Cascade.AllDeleteOrphan() 
       .Access.AsCamelCaseField(Prefix.Underscore);