FluentNHibernate映射选择:CamelCaseField与ReadOnlyPropertyThroughCamelCaseField
正确的FluentNHibernate映射选择及原因
先看给定的User类定义:
public class User { private IList<ActivationToken> _activationTokens; public virtual IReadOnlyList<ActivationToken> ActivationTokens => _activationTokens.AsReadOnly(); }
现在要从两个映射选项里选出正确的:
选项1:
HasMany( x => x.ActivationTokens ).Access.CamelCaseField( Prefix.Underscore );
选项2:
HasMany( x => x.ActivationTokens ).Access.ReadOnlyPropertyThroughCamelCaseField( Prefix.Underscore );
正确选项是第二个,原因如下:
- User类里的
ActivationTokens是只读属性,它仅返回私有字段_activationTokens的只读包装,本身不支持写入;但NHibernate需要操作底层可写的集合字段_activationTokens来完成数据持久化。 ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)这个访问策略就是专门适配这种场景:它能识别到我们映射的是只读属性,自动关联到对应的私有驼峰式带下划线字段_activationTokens,让NHibernate直接操作这个可写字段完成数据读写,同时保留属性的只读特性。- 而第一个选项的
CamelCaseField是直接将映射目标指向字段,但我们这里指定的映射路径是属性ActivationTokens,这个策略会导致NHibernate混淆属性和字段的关系——因为属性是只读的,NHibernate无法通过属性写入数据,直接映射字段又不符合我们通过属性暴露集合的设计,最终会引发持久化操作异常。
内容的提问来源于stack exchange,提问作者speednick
相关产品推荐
相关产品推荐

