Прежде всего, ваш член _parts не может быть доступен только для чтения.NHibernate нужен доступ на запись к члену, чтобы установить значение / ссылку.Чтобы вернуть действительно доступную только для чтения коллекцию через свойство Parts, необходимо вернуть System.Collections.ObjectModel.ReadOnlyCollection.Это также «удаляет» все методы, найденные в типах коллекций чтения / записи, которые все еще существуют, если вы просто возвращаете f.ex.list.AsReadOnly ().Список только для чтения, возвращаемый таким способом, все еще имеет метод .Add () и другие для редактирования коллекции, но они вызовут исключение времени выполнения, поэтому возврат ReadOnlyCollection для начала отлично подходит для предотвращения этой возможности.
Многим людям нравится возвращать IEnumerable, который также доступен только для чтения, но его можно привести к списку или другому типу коллекции для чтения / записи и изменить таким образом.
Вам необходимо реализовать AddPart иМетоды RemovePart, позволяющие внешнему коду добавлять и удалять элементы в коллекции только для чтения.
Ваше соглашение выглядит правильно, я использую точно такой же синтаксис с 1.2.0.694 успешно , мойсоглашение:
instance.Key.Column(instance.EntityType.Name + "Fk");
instance.Fetch.Subselect();
instance.Inverse();
instance.Cascade.All();
instance.Access.ReadOnlyPropertyThroughCamelCaseField(CamelCasePrefix.Underscore);
Пример класса:
public class Car
{
private List<Part> _parts;
public Car()
{
// Initialize member collection _parts
_parts = new List<Part>();
}
public virtual int Id { get; set; }
// Return readonlycollection here, ReadOnlyCollection implements
// IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable,
// so the returned list can be any collection type inheriting from these base types.
public ReadOnlyCollection<Part> Parts
{
get { return new List<Part>(_parts).AsReadOnly(); } }
}
public AddPart(Part part)
{
// Usually I don't want duplicates
if (!_parts.Contains(part))
_parts.Add(part);
}
}