FluentNHibernate-ReadOnlyPropertyThroughCamelCaseField(前缀.下划线)
有人能确认这并没有按预期工作,因为我得到一个错误,它试图访问属性,而不是试图访问字段FluentNHibernate-ReadOnlyPropertyThroughCamelCaseField(前缀.下划线),nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,有人能确认这并没有按预期工作,因为我得到一个错误,它试图访问属性,而不是试图访问字段 private IList<MetaPackage> _metaPackages; public virtual IEnumerable<MetaPackage> MetaPackages { get { return _metaPackages; } } private-IList\u元包; 公共虚拟IEnumerable元包 { 得到 { 返回元包; } } 流畅映
private IList<MetaPackage> _metaPackages;
public virtual IEnumerable<MetaPackage> MetaPackages
{
get
{
return _metaPackages;
}
}
private-IList\u元包;
公共虚拟IEnumerable元包
{
得到
{
返回元包;
}
}
流畅映射
HasMany<MetaPackage>(x
=>x.MetaPackages).Table("dnnSphere_Package").KeyColumn("Id")
.Inverse().LazyLoad().Cascade.AllDeleteOrphan()
.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
HasMany(x
=>x.MetaPackages).Table(“dnnSphere\u packages”).KeyColumn(“Id”)
.Inverse().LazyLoad().Cascade.AllDeleteOrphan()
.Access.ReadOnlyPropertyThroughCamelCaseField(前缀为.下划线)
单元测试
new PersistenceSpecification<MetaProject>(Session)
.CheckProperty(x => x.Name, "Test")
.CheckProperty(x => x.Description, "Description")
.CheckList(x=>x.MetaPackages, new List<MetaPackage> { new
MetaPackage ("name")})
.VerifyTheMappings();
新的PersistenceSpecification(会话)
.CheckProperty(x=>x.Name,“测试”)
.CheckProperty(x=>x.Description,“Description”)
.CheckList(x=>x.MetaPackages,新列表{new
元包(“名称”)})
.验证应用程序();
错误:
它抛出一个找不到属性setter的错误,即使它应该通过一个字段,因为它是只读属性
System.ArgumentException:属性集
找不到方法。在
System.Reflection.RuntimePropertyInfo.SetValue(对象
对象,对象值,绑定标志
invokeAttr,活页夹,对象[]
索引,文化信息(文化)位于
System.Reflection.RuntimePropertyInfo.SetValue(对象
对象,对象值,对象[]索引)位于
FluentNHibernate.Testing.PersistenceSpecification1.ListValue
1.SetValue(Ob
(目标)在
E:\Users\epitka\Documents\DEVELOPMENT\fluent-
nhibernate\src\FluentNHibernate\Testing\PersistenceSpecification.cs:
第174行
如果开关策略使用ReadOnlyPropertyThoughPascalCaseField,则会正确抛出此错误:
NHibernate.PropertyNotFoundException:
找不到字段“\u MetaPackages”
课堂上
'dnnSphere.Meta.Model.MetaProject'
因此,ReadOnlyPropertyThroughCamelCaseField(前缀.下划线)似乎错误地将其映射到属性而不是字段。Ok,“问题”在PersistenceSpecification中是(如果可以称为问题的话)。它与PropertyInfo一起工作,不管它是如何映射的,并且需要在属性上设置setter。不理想,但可以创建私有setter,以便能够使用PersistenceSpecification进行测试。我也遇到了同样的问题,但我不想使用属性setter。因为我已经有了一个添加项目的公共方法,所以我做了与此等效的操作:
new PersistenceSpecification<MetaProject>(Session)
.CheckProperty(x => x.Name, "Test")
.CheckProperty(x => x.Description, "Description")
.CheckList(
x => x.MetaPackages,
new List<MetaPackage> { new MetaPackage ("name") },
(MetaProject project, MetaPackage package) =>
{
project.AddPackage(package);
}
.VerifyTheMappings();
新的PersistenceSpecification(会话)
.CheckProperty(x=>x.Name,“测试”)
.CheckProperty(x=>x.Description,“Description”)
.检查表(
x=>x.MetaPackages,
新列表{new MetaPackage(“name”)},
(元项目、元包)=>
{
项目.添加包(包);
}
.验证应用程序();
似乎这只是CheckList()
的一些重载问题