FluentNHibernate - ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)

时间:2009-09-17 15:59:38

标签: nhibernate fluent-nhibernate

任何人都可以确认这不会按预期工作,因为我收到的错误是它试图访问属性而不是尝试访问字段。

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

错误:

它抛出一个错误,它找不到Property setter,即使它应该通过一个字段,因为它是readonly属性。

  

System.ArgumentException:属性集   找不到方法。在   System.Reflection.RuntimePropertyInfo.SetValue(对象   obj,Object value,BindingFlags   invokeAttr,Binder binder,Object []   索引,文化信息文化)   System.Reflection.RuntimePropertyInfo.SetValue(对象   obj,Object value,Object [] index)at   FluentNHibernate.Testing.PersistenceSpecification 1.ListValue 1.SetValue(OB   ject target)in   E:\用户\ epitka \文档\开发\ fluent-   NHibernate的的\ src \ FluentNHibernate \测试\ PersistenceSpecification.cs:   第174行

如果切换策略使用ReadOnlyPropertyTrhoughPascalCaseField它会正确抛出此错误:

  

NHibernate.PropertyNotFoundException:   找不到字段'_MetaPackages'   在班上   'dnnSphere.Meta.Model.MetaProject'

因此,似乎ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)将其错误地映射到属性而不是映射到字段。

2 个答案:

答案 0 :(得分:2)

好的,PersistenceSpecification中的“问题”是(如果它可以被称为问题)。它适用于PropertyInfo,无论它如何映射并且需要属性上的setter。不理想,但可以创建私有的setter,以便能够使用PersistenceSpecification进行测试。

答案 1 :(得分: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()的一些重载问题。