2010-07-20 35 views
1

在CategoriesTranslated集合中,我有這個錯誤:非法訪問加載收集。Fluent NH - 非法訪問加載收集

public class Category : Entity 
{ 
    public Category() 
    { 
     CategoriesTranslated = new List<CategoryTranslated>(); 

    } 

    public virtual Category Parent { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<CategoryTranslated> CategoriesTranslated { get; set; } 
} 

public class CategoryTranslated : Entity 
{ 
    public CategoryTranslated() 
    { 
    } 

    public virtual Category Category { get; set; } 
    public virtual LanguageType Language { get; set; } 
    public virtual string Name { get; set; } 
} 


    public void Override(AutoMapping<Category> mapping) 
    { 
     mapping.HasMany(x => x.CategoriesTranslated) 
      .Inverse() 
      .Cascade.All(); 

    } 

    public void Override(AutoMapping<CategoryTranslated> mapping) 
    { 
     mapping.References(x => x.Category); 
    } 

的SQL:

CREATE TABLE Category(
    [Id] smallint primary key identity(1,1), 
    [Parent] smallint null, 
    [Name] varchar(50) not null unique, 
    ) 
    alter table [Category] add CONSTRAINT fk_Category_Category 
FOREIGN KEY(Parent) references Category (Id) 
go 


    CREATE TABLE CategoryTranslated(
    [Id] smallint primary key identity(1,1), 
    [Category] smallint not null, 
    [Language] tinyint not null, 
    [Name] varchar(50) not null, 
    ) 

    alter table [CategoryTranslated] add CONSTRAINT fk_CategoryTranslated_Category 
FOREIGN KEY(Category) references Category (Id) 
go 

這是哪裏錯了?

UPDATE 到HBM generater鏈接:

類別:
http://uploading.com/files/fmb71565/SubmitSiteDirectory.Core.Category.hbm.xml/

類別翻譯: http://uploading.com/files/9c9aaem9/SubmitSiteDirectory.Core.CategoryTranslated.hbm.xml/

+0

沒有人能幫助我嗎? – 2010-07-20 13:09:27

回答

1

我猜測它與創建內部列表做構造函數,尤其是如果您爲NHib保留了默認ctor。而NHib正在嘗試在創建之前設置列表。這裏的另一個複雜因素是你有一個雙向關係,並且CategoryTranslated可能會在它創建之前嘗試獲取列表。

我懷疑這是唯一的解決辦法,但這裏是我使用的是要解決該錯誤的模式:

/// <summary>Gets the ....</summary> 
    /// <remarks>This is what is available to outside clients of the domain.</remarks> 
    public virtual IEnumerable<CategoryTranslated> CategoriesTranslated{ get { return _InternalCategoriesTranslated; } } 

    /// <summary>Workhorse property that maintains the set of translated categories by: 
    /// <item>being available to <see cref="Category"/> to maintain data integrity.</item> 
    /// <item>lazily instantiating the <see cref="List{T}"/> when it is needed.</item> 
    /// <item>being the property mapped to NHibernate, the private <see cref="_categoriesTranslated"/> field is set here.</item> 
    /// </list> 
    /// </summary> 
    protected internal virtual IList<Category> _InternalCategoriesTranslated 
    { 
     get { return _categoriesTranslated?? (_categoriesTranslated= new List<Category>()); } 
     set { _categoriesTranslated= value; } 
    } 
    private IList<StaffMember> _categoriesTranslated; 

現在你需要設置你的映射來訪問私有字段,所以假設你用我的這裏外殼的喜好,你必須:

public void Override(AutoMapping<Category> mapping) 
{ 
    mapping.HasMany(x => x.CategoriesTranslated) 
     .Inverse() 
     .Access.CamelCaseField(CamelCasePrefix.Underscore) 
     .Cascade.All(); 
} 

HTH,
Berryl

編輯============

的_Internal藏品中還給出了雙向關係的孩子,CategoryTranslated在這種情況下,鉤,如下面的代碼所示:

public virtual CategoryTranslated CategoryTranslated 
    { 
     get { return _categoryTranslated; } 
     set 
     { 
      if (_categoryTranslated!= null) 
      { 
       // disassociate existing relationship 
       _categoryTranslated._InternalCategoryTranslated.Remove(this); 
      } 

      _categoryTranslated= value; 

      if (value != null) 
      { 
       //make the association 
       _categoryTranslated._InternalCategoryTranslated.Add(this); 
      } 
     } 
    } 
    private CategoryTranslated _categoryTranslated; 
+0

感謝您的重播。 在行.Access.CamelCaseField(CamelCasePrefix.Underscore) 我有此錯誤: CamelCasePrefix是不能分配給參數類型FluentNhibernate.mapping.Prefix – 2010-07-20 16:45:42

+0

我試圖這樣:.Access.CamelCaseField(FluentNHibernate.Mapping.Prefix.Underscore) 我用你的相同的屬性名稱:_InternalCategoriesTranslated 但是,當我看着集合與調試我有同樣的錯誤。 – 2010-07-20 16:57:19

+0

你也應該發佈你的hbms,因爲沒有耐心的人會等待非高級下載(如moi!)。 _內部的東西是讓域懶洋洋地構建集合,並給你雙向關係的另一端(即CategoryTranslated)一種掛鉤的方式,但不是映射。看到我編輯的答案。你應該也可以發佈錯誤 – Berryl 2010-07-20 17:19:17