【问题标题】:Fluent NH - illegal access to loading collectionFluent NH - 非法访问加载集合
【发布时间】:2010-12-22 06:30:31
【问题描述】:

在 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);
    }

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

哪里错了?

更新 hbm生成器的链接:

类别:
http://uploading.com/files/fmb71565/SubmitSiteDirectory.Core.Category.hbm.xml/

翻译类别: http://uploading.com/files/9c9aaem9/SubmitSiteDirectory.Core.CategoryTranslated.hbm.xml/

【问题讨论】:

    标签: nhibernate fluent-nhibernate nhibernate-mapping


    【解决方案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,
    浆果

    编辑 ============

    _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;
    

    【讨论】:

    • 感谢您的重播。在行 .Access.CamelCaseField(CamelCasePrefix.Underscore) 我有这个错误: CamelCasePrefix is not assignable to parameter type FluentNhibernate.mapping.Prefix
    • 我试过这个:.Access.CamelCaseField(FluentNHibernate.Mapping.Prefix.Underscore) 我使用了相同的属性名称:_InternalCategoriesTranslated 但是当我用调试查看集合时,我有同样的错误。跨度>
    • 你也应该发布你的hbms,因为没有耐心等待非高级下载的人(比如moi!)。 _Internal 的东西是为了让域懒惰地构造集合,并为双向关系的另一端(即 CategoryTranslated)提供一种挂钩的方式,而不是映射。请参阅我编辑的答案。您可能也应该发布错误
    • @Andrea / Mark:我的错,访问代码是从我使用的 FNH 约定中提取的;在类映射中,只需将其更改为“.Access.LowerCaseField(Prefix.Underscore)”即可。干杯
    猜你喜欢
    • 2011-05-18
    • 2011-01-30
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多