1

NHibernate似乎不喜歡返回一個ReadOnlyCollection,depsite我已經實現了我已經讀過的大約30個地方,作爲一個只讀集合的​​正確訪問策略支持私有字段。NHibernate和ReadOnlyCollection <T>

我在實體下面的代碼:

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仍然堅持讓後臺列表通過只准備集合,當我做.Clear(),而不是像我已經告訴它在映射中一樣的東西嗎?我只是爲了持久層而改變我的域模型,但是NHibernate似乎並不想合作。

我得到的錯誤是「擁有cascade =」all-delete-orphan「的集合不再被擁有的實體實例引用」,但是當我在屬性獲取器中返回this._aliases時,它會消失。

回答

2

我一般使用這樣的集合,並且沒有問題:

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(); 

我不知道究竟如何使用您的收藏得到這個錯誤,但我一般都添加和刪除的方法我的集合在類中。如果這不能幫助你,也許你可以發佈導致該錯誤的例子。

下面是一篇相關的文章我貼在幾個月前:

Exposing HasMany and ManyToMany relationships as IEnumerable

+0

偉大的東西。使用.Select(x => x)解決了我一直存在的許多問題,並且仍將它保留爲只讀。標記你的接受答案。謝謝。 – starskythehutch 2012-02-23 15:19:50

相關問題