2009-09-17 43 views
1

任何人都可以证实这不能按预期工作,因为我得到一个错误,它试图访问属性,而不是尝试访问字段。FluentNHibernate - ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)

private IList<MetaPackage> _metaPackages; 
public virtual IEnumerable<MetaPackage> MetaPackages 
{ 
get 
{ 
    return _metaPackages; 
} 
} 

流利的映射

HasMany<MetaPackage>(x 
=>x.MetaPackages).Table("dnnSphere_Package").KeyColumn("Id") 
.Inverse().LazyLoad().Cascade.AllDeleteOrphan()    
.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore) 

单元测试

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

错误:

它抛出一个错误,它无法找到的属性设置,即使它应该走线槽场,因为它是只读属性。

System.ArgumentException: Property set method not found. at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index) at FluentNHibernate.Testing.PersistenceSpecification 1.ListValue 1.SetValue(Ob ject target) in E:\Users\epitka\Documents\DEVELOPMENT\fluent- nhibernate\src\FluentNHibernate\Testing\PersistenceSpecification.cs: line 174

如果如果交换机策略使用ReadOnlyPropertyTrhoughPascalCaseField它正确地抛出这个错误:

NHibernate.PropertyNotFoundException: Could not find field '_MetaPackages' in class 'dnnSphere.Meta.Model.MetaProject'

如此看来,ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)不正确映射它的财产而不是到现场。

回答

2

好的,在PersistenceSpecification中,“问题”是(如果它可以称为问题)。它与PropertyInfo一起工作,无论它如何映射并需要属性上的setter。不理想,但可以创建专用setter以便能够使用PersistenceSpecification进行测试。

1

我有同样的问题,但我不想使用属性设置器。因为我已经有一个公共的方法来添加项目,我做的这相当于:

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

现在看来似乎是只与CheckList()一些重载的问题。