我有一个类如下:(SpecialFoo Implement IFoo)
private SpecialFoo _foo { get; set; }
public virtual SpecialFoo SpecialFoo
{
get { return _foo; }
protected internal set { _foo = value; }
}
public virtual IFoo Foo
{
get { return _foo; }
}
映射:
References(x => x.SpecialFoo)
.Column("Special_Foo_Id")
.Not.Insert()
.Not.Update();
但是当我尝试查询interace时,它回来时流畅的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();
任何人都可以提供有关如何解决这个问题以及为什么会发生这种情况的线索吗?我在Stackoverflow上阅读了一些与此相关的不同问题,但不幸的是,所提供的解决方案似乎都不适用于我的具体案例。
答案 0 :(得分:1)
默认情况下,它会尝试针对该属性进行设置,但由于受到保护,因此无法访问该属性。
您可以更新映射以指定其他访问权限。或<。p>
.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
但在这种情况下,您的属性支持字段应与属性名称相同,如:
private SpecialFoo _specialFoo { get; set; }
public virtual SpecialFoo SpecialFoo
{
get { return _specialFoo; }
protected internal set { _specialFoo = value; }
}
编辑:回答下面的问题。
您可以将后场保持与映射属性相同,在这种情况下,您将更新Foo属性以使用_specialFoo后备字段。
或者您可以透露该成员。 (这是未经测试的,因为我把它写在了我的头顶)
References(Reveal.Member<SpecialFoo>("_foo"));
https://github.com/jagregory/fluent-nhibernate/wiki/Mapping-private-properties
这意味着它将根据您定义的名称直接查找支持字段,而不是根据您的属性和命名约定推断名称。