NHibernate и ReadOnlyCollection <T> - PullRequest
       16

NHibernate и ReadOnlyCollection <T>

1 голос
/ 23 февраля 2012

NHibernate на самом деле не любит возвращать ReadOnlyCollection, из-за чего я реализовал то, что прочитал примерно в 30 местах, как правильную стратегию доступа для коллекции только для чтения, возвращенной в приватное поле.

У меня есть следующий код в моей сущности:

private readonly IList<TagAlias> _aliases = new List<TagAlias>();

public IEnumerable<TagAlias> Aliases
{
    get
    {
        return new ReadOnlyCollection<TagAlias>(this._aliases); 
    }
}

и следующее отображение, чтобы разрешить доступ к вспомогательному полю

public sealed class TagMap : ClassMap<Tag>
{
    public TagMap()
    {
        Table("Tag");
        Id(x => x.Id).Column("TagId").GeneratedBy.Identity();
        Map(x => x.Value).Column("TagName");
        HasMany(x => x.Aliases)
            .AsSet()
            .Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
            .KeyColumn("TagId")
            .LazyLoad()
            .Inverse()
            .Cascade.AllDeleteOrphan();
    }
}

С какой стати NHibernate по-прежнему настаивает на получении списка поддержки через коллекцию only only, когда я делаю что-то вроде .Clear (), вместо того, чтобы обращаться к нему, как я сказал в отображении? Я не хочу менять свою модель предметной области только ради слоя постоянства, но NHibernate, похоже, просто не хочет сотрудничать.

Я получаю сообщение об ошибке: «Коллекция с cascade =« all-delete-orphan »больше не упоминается экземпляром объекта-владельца», но она исчезает, когда я просто возвращаю this._aliases в методе получения свойства.

1 Ответ

2 голосов
/ 23 февраля 2012

Я обычно использую коллекции, подобные этой, и у меня нет проблем:

private IList<OrderLine> orderLines;
public virtual IEnumerable<OrderLine> OrderLines 
{ 
    get { return orderLines.Select(x => x); } 
}

HasMany(x => x.OrderLines)
            .Access.CamelCaseField()
            .KeyColumn("ORDER_ID")
            .Inverse()
            .Cascade.AllDeleteOrphan();

Я не уверен, как именно вы используете свои коллекции, чтобы получить эту ошибку, но у меня обычно есть методы добавления и удалениядля моих коллекций внутри классов.Если это вам не поможет, возможно, вы можете опубликовать пример, который вызывает эту ошибку.

Вот статья, которую я опубликовал несколько месяцев назад:

Представление отношений HasMany и ManyToMany какIEnumerable

...