C# NHibernate和只读集合<;T>;

C# NHibernate和只读集合<;T>;,c#,.net,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,C#,.net,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,NHibernate似乎真的不喜欢返回ReadOnlyCollection,我已经实现了我在大约30个地方读到的内容,作为备份到私有字段的只读集合的正确访问策略 我的实体中有以下代码: private readonly IList<TagAlias> _aliases = new List<TagAlias>(); public IEnumerable<TagAlias> Aliases { get { return new

NHibernate似乎真的不喜欢返回ReadOnlyCollection,我已经实现了我在大约30个地方读到的内容,作为备份到私有字段的只读集合的正确访问策略

我的实体中有以下代码:

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

public IEnumerable<TagAlias> Aliases
{
    get
    {
        return new ReadOnlyCollection<TagAlias>(this._aliases); 
    }
}
private readonly IList_alias=new List();
公共IEnumerable别名
{
得到
{
返回新的ReadOnlyCollection(此.\u别名);
}
}
以及以下映射,以允许访问备份字段

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();
    }
}
公共密封类标记映射:类映射
{
公共标记映射()
{
表(“标签”);
Id(x=>x.Id).Column(“TagId”).GeneratedBy.Identity();
映射(x=>x.Value).Column(“标记名”);
HasMany(x=>x.alias)
1.资产()
.Access.ReadOnlyPropertyThroughCamelCaseField(前缀为.下划线)
.KeyColumn(“TagId”)
.LazyLoad()
.Inverse()
.Cascade.AllDeleteOrphan();
}
}
当我执行.Clear()之类的操作时,为什么NHibernate仍然坚持通过ready only集合获取支持列表,而不是像我在映射中告诉它的那样访问它?我不愿意仅仅为了持久层而改变我的域模型,但是NHibernate似乎并不想合作


我得到的错误是“拥有实体实例不再引用带有cascade=“all delete orphan”的集合”,但当我只返回
this时,它就消失了。\u属性getter中的别名

我通常使用这样的集合,并且没有问题:

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();
私有IList订单行;
公共虚拟IEnumerable订单行
{ 
获取{返回订单行。选择(x=>x);}
}
HasMany(x=>x.OrderLines)
.Access.CamelCaseField()
.KeyColumn(“订单ID”)
.Inverse()
.Cascade.AllDeleteOrphan();
我不确定您是如何使用集合来获取此错误的,但我通常在类中为集合添加和删除方法。如果这对你没有帮助,也许你可以发布导致错误的例子

以下是我几个月前发布的一篇相关文章:


好东西。使用.Select(x=>x)解决了我一直遇到的许多问题,并且仍然将其保持为只读。将您的答案标记为已接受答案。非常感谢。