Fluent nhibernate 尝试使用备份字段访问属性时,fluent nhibernate无法解析属性

Fluent nhibernate 尝试使用备份字段访问属性时,fluent nhibernate无法解析属性,fluent-nhibernate,Fluent Nhibernate,我有一个如下的类:(SpecialFoo实现IFoo) 映射: References(x => x.SpecialFoo) .Column("Special_Foo_Id") .Not.Insert() .Not.Update(); 但当我试图查询interace时,它返回的结果是fluent nhibernate无法解析属性。如果我把它改成使用SpecialFoo,它就会工作 //Doesn't Work return (from s in _session.L

我有一个如下的类:(SpecialFoo实现IFoo)

映射:

References(x => x.SpecialFoo)
    .Column("Special_Foo_Id")
    .Not.Insert()
    .Not.Update();
但当我试图查询interace时,它返回的结果是fluent nhibernate无法解析属性。如果我把它改成使用SpecialFoo,它就会工作

//Doesn't Work
return (from s in _session.Linq<SpecialFoo>()
          where s.Foo.ID == id
          select s).ToList();

//Works
return (from s in _session.Linq<SpecialFoo>()
          where s.SpecialFoo.ID == id
          select s).ToList();
//不起作用
返回(从session.Linq()中的s)
其中s.Foo.ID==ID
选择s.ToList();
//工作
返回(从session.Linq()中的s)
其中s.SpecialFoo.ID==ID
选择s.ToList();

有没有人能提供线索,说明如何解决这个问题以及为什么会发生这种情况?我阅读了一系列与此相关的Stackoverflow问题,但不幸的是,所提供的解决方案似乎都不适用于我的具体情况。

默认情况下,它将尝试针对该属性进行设置,但由于该属性受到保护,它将无法访问该属性

您可以更新映射以指定不同的访问或设置

.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
但在这种情况下,属性支持字段应与属性名称相同,如:

private SpecialFoo _specialFoo { get; set; }
public virtual SpecialFoo SpecialFoo 
{
  get { return _specialFoo; }
  protected internal set { _specialFoo = value; }
}
编辑:回答下面的问题

您可以保持backfield与mapped属性相同,在这种情况下,您可以更新Foo属性以使用_specialfoobacking字段

或者你可以透露成员。(这是未经测试的,因为我已经把它写下来了)

References(discover.Member(“_-foo”);


这意味着它将根据您定义的名称直接查找支持字段,而不是根据您的属性和命名约定推断名称。

谢谢,有没有办法保留单个支持字段?我希望接口和真实对象都可用,并且我只希望有一个支持字段。@Phill,谢谢!不幸的是,当
Foo
是readony属性时,我仍然不清楚如何执行
,其中s.Foo.ID==ID
。在我的例子中,
SpecialFoo
是一个受保护的
IList
集合,它可以通过
HasMany
映射。但是
Foo
不是
Foo
是这个受保护的IList
SpecialFoo
@AndreyKomissarov上的只读IEnumerable。我不明白你的问题。上面的答案只是关于映射不可变对象。如果您有问题,我建议您创建一个新的问题,以便解释您试图实现的目标。@Phill,谢谢,我刚刚创建了它
private SpecialFoo _specialFoo { get; set; }
public virtual SpecialFoo SpecialFoo 
{
  get { return _specialFoo; }
  protected internal set { _specialFoo = value; }
}
References(Reveal.Member<SpecialFoo>("_foo"));