如何在Fluent NHibernate中映射受保护的集合?

5
我尝试使用Fluent中的Reveal属性,但是无法将其与集合一起编译。我想让实体中的一个集合受到保护,并且除了实体本身之外任何地方都无法访问。这可能吗?谢谢。
编辑:
这是我正在尝试使用的代码:
HasMany<Trip>(x => Reveal.Property<Trip>("_trips"));

我也尝试了这段代码:

HasMany<Trip>(Reveal.Property<Organization>("_trips"));

每次我的应用程序运行时,NHibernate都会说它无法映射到“属性”,或者抛出一个未知的异常。

1
Reveal 应该能够与集合一起使用,可以展示一下你是如何做到的吗? - James Gregory
你的 Trip 模型是如何定义的? - Daniel A. White
你是否曾经得到关于“Property”的Nhibernate异常的答案,我也遇到了同样的问题。 - Duncan Roosma
2个回答

8
假设组织有一个 IList<Trip>,那么以下代码应该可以工作: HasMany<Trip>(Reveal.Property<Organization>("_trips")); 请注意它是一个属性,并且你需要保护 getters 和 setters(私有的不行,因为 NHibernate 会想要代理集合以进行延迟加载)。

1
就像你所说的,我认为关键是要确保它是IList,而不是List。我只是提醒这个细节,因为我刚刚读了你的答案,然后继续将其实现为List<T>...也许这个评论会帮助其他人避免这个错误。 - Seth Petry-Johnson
这是一个关于编程的话题,虽然有些晚了。但你知道Nhibernate是否满足于字段呢?还是需要使用属性?在我目前的项目中,我更喜欢使用字段。 - Magnus Backeus
你可以使用字段。在FNH中,我认为你需要更改.Access修饰符,并且应该有一个字段选项。 - Bruno Lopes
是的,有许多变体的语法看起来是正确的,但实际上并不起作用。欺骗我的是,Reveal.Member<TYPE> 是拥有类而不是列表类型。 - PandaWood

0
最简单的答案是允许映射受保护的内部虚拟属性。这在 NHibernate Fluent 的文档中有说明documentation
  1. 打开您的 AssemblyInfo.cs(位于 Properties 下)文件并添加以下内容:[assembly: InternalsVisibleTo("MyDomain.mapping")] 其中字符串是映射的命名空间。
  2. 使用protected internal virtual访问声明创建属性。

        protected internal virtual IList<Clinician> __AppointmentMemberAttendees { get; set; }
    
  3. 像平常一样映射项目。

        HasManyToMany(x => x.__AppointmentMemberAttendees)
               .Table("__AppointmentToAttendeesMember")
               .Cascade.None();
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接