NHibernate可以使用的只读集合属性

Dav*_*vid 4 collections nhibernate fluent-nhibernate readonly-collection

我的域类具有如下所示的集合:

private List<Foo> _foos = new List<Foo>();
public virtual ReadOnlyCollection<Foo> Foos { get { return _foos.AsReadOnly(); } }
Run Code Online (Sandbox Code Playgroud)

这给了我readonly集合,可以从类中修改(即使用字段_foos).

此集合映射如下(Fluent NHibernate):

HasMany(x => x.Foos).KeyColumn("ParentClassId").Cascade.All().Inverse().Access.CamelCaseField(Prefix.Underscore);
Run Code Online (Sandbox Code Playgroud)

现在当我尝试使用这个系列时,我得到:

无法转换'NHibernate.Collection.Generic.PersistentGenericBag 1[Foo]' to type 'System.Collections.Generic.List1 [Foo]' 类型的对象.

根据Unable将NHibernate.Collection.Generic.PersistentGenericBag类型的对象强制转换为List,这是因为集合需要作为接口公开给NHibernate,以便NHibernate可以注入一个自己的集合类.

本文建议使用IList,但遗憾的是这个接口不包含AsReadOnly()方法,弄乱了我的计划,只向外部世界公开一个只读集合.

任何人都可以建议我可以使用哪种界面,一种满足相同要求的不同方法,或者不涉及这种挫折的另类职业?

谢谢

大卫

Dav*_*vid 7

AsReadOnly()方法不是获取ReadOnlyCollection的唯一方法.

private IList<Foo> _foos = new List<Foo>();
public virtual ReadOnlyCollection<Foo> Foos { get { return new ReadOnlyCollection<Foo>(_foos); } }
Run Code Online (Sandbox Code Playgroud)

另一个篮筐跳了起来.


Jam*_*Ide 5

你的答案是一个很好的解决方案,但我只是将集合公开为IEnumerable<T>.这种方法存在一个小风险,因为这些可以转回IList.这是否是可接受的风险取决于应用程序.