Nhibernate Fluent NH-非法访问加载集合

Nhibernate Fluent NH-非法访问加载集合,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,在CategoriesTranslated集合中,我有一个错误:非法访问加载集合 public class Category : Entity { public Category() { CategoriesTranslated = new List<CategoryTranslated>(); } public virtual Category Parent { get; set; } public virtual st

在CategoriesTranslated集合中,我有一个错误:非法访问加载集合

 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);
    }
哪里错了

更新 hbm发电机的链接:

类别:

类别翻译:

我猜这与构造函数内部列表的创建有关,特别是如果您为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;

谢谢你的重播。在.Access.CamelCaseField(CamelCasePrefix.下划线)行中,我遇到以下错误:CamelCasePrefix不可分配给参数类型FluentNhibernate.mapping.Prefixi尝试了以下操作:.Access.CamelCaseField(FluentNhibernate.mapping.Prefix.下划线)我使用了您相同的属性名称:_InternalCategoriesTranslated,但当我使用debug查看集合时,出现了相同的错误。您也应该发布您的hbms,以便没有耐心等待非高级下载(如moi!)的用户。_内部的东西是让域懒洋洋地构建集合,并为双向关系的另一端(即,CategoryTranslated)提供一种钩住的方式,而不是映射。请参阅我编辑的答案。您可能应该发布错误too@Andrea/马克:我的错,访问代码是从我使用的FNH约定中取消的;在类映射中,只需将其更改为“.Access.LowerCaseField(Prefix.underline)”即可。干杯
    /// <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();
}
    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;