gpt4 book ai didi

nhibernate - 如何在 (Fluent) NHibernate 中添加只读集合属性?

转载 作者:行者123 更新时间:2023-12-04 06:57:51 26 4
gpt4 key购买 nike

我想控制我的域与集合的交互,所以我想我会让集合受到保护并在它周围提供一个只读包装器以便内容可见,但我可以确保项目不会直接添加到集合中.

所以我有以下代码:

public class MyClass
{
public virtual ICollection<Thread> Threads
{
get { return new ReadOnlyWrappedCollection<Thread>(this.ThreadsInternal); }
}

protected virtual ICollection<Thread> ThreadsInternal { get; private set; }
}

我试过这个:
this.Map(c => c.Threads)
.Access.None();

结果是 MappingException: Could not determine type for: System.Collections.Generic.ICollection'1[[Thread]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, for columns: NHibernate.Mapping.Column(Threads)
我试过这个:
this.HasMany(c => c.Threads)
.Access.None();

结果是 InvalidOperationException: Tried to add collection 'Threads' when already added
如果我省略映射,我会得到 PropertyNotFoundException: Could not find a setter for property 'Threads' in class 'MyClass'
如何说服 NHibernate 在映射中忽略此属性?我正在使用 Fluent NHibernate,但也请在 hbm 中发布示例。

最佳答案

我认为您无法映射 ICollection。无论如何,我都遵循类似的模式,并且我发现映射它的最佳方法是映射私有(private) IList。

类(class):

public class Invoice
{
private IList<InvoiceItem> _items;

public Invoice()
{
_items = new List<InvoiceItem>();
}

public virtual IEnumerable<InvoiceItem> Items
{
get { return _items; }
}
}

映射:
public class InvoiceMap : ClassMap<Invoice>
{
public InvoiceMap()
{
Table("Invoice");

HasMany(x => x.Items).KeyColumn("InvoiceId")
.Access.CamelCaseField(Prefix.Underscore)
.Cascade.AllDeleteOrphan()
.Inverse()
.AsBag().LazyLoad();
}
}

映射中的关键行是 .Access.CamelCaseField(Prefix.Underscore)它告诉 NHibernate 使用私有(private)字段 _items。请注意,仍然可以将集合转换为 IList,但如果需要,您可以将其包装在只读集合中。

关于nhibernate - 如何在 (Fluent) NHibernate 中添加只读集合属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2326141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com