.net NHibernate:映射到字段或属性?

.net NHibernate:映射到字段或属性?,.net,nhibernate,.net,Nhibernate,创建映射文件时,是否将属性映射到字段或属性: <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Foo" namespace="Foo.Bar" > <class name="Foo" table="FOOS" batch-size="100"> [...] <property name="FooProperty1" access="field.camelcase" c

创建映射文件时,是否将属性映射到字段或属性:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Foo" namespace="Foo.Bar" >
  <class name="Foo" table="FOOS" batch-size="100">
    [...]
    <property name="FooProperty1" access="field.camelcase" column="FOO_1" type="string" length="50" />
    <property name="FooProperty2" column="FOO_2" type="string" length="50" />
    [...]
  </class>
</hibernate-mapping>

[...]
[...]
当然,请解释原因:)

通常,我映射到属性,但是映射到字段可以使属性的getter/setter中包含一些“逻辑”


映射到字段是否“不好”?是否有最佳实践?

我映射到属性,我没有遇到映射到字段的情况。。。当我有我的B.O.设计的需要。我认为它允许更好的架构

我映射到属性。如果我觉得有必要,我会将SETTER映射到一个字段。(通常通过类似“access=field.camelcase”的方式)


这让我有了漂亮的查询,例如“来自名字为‘John’的人”,而不是“来自名字为/_FirstName的人”,并且在水合实体时避免了setter逻辑。

我映射到属性,因为我使用自动属性


除了集合(如
set
s)。那些我映射到字段的集合(
access=“field.camelcase下划线”
)因为我没有公开它们的公共属性,但是有方法。

属性在数据进出持久性存储时需要对其进行处理的情况下也很有用。这通常应该避免,但一些罕见的业务案例或遗留支持有时需要这样做


(请记住,如果在使用getter返回数据时以某种方式转换数据,NHibernate(默认情况下)将使用getter返回的数据,并在刷新/关闭会话时以这种方式将其保存回数据库。请确保这是您想要的。)我倾向于同意上面的答案。通常,映射到几乎所有内容的属性,然后映射到集合设置器的字段。
您希望映射到字段的唯一其他位置是当您有以下内容时:

public class AuditableEntity
{
   /*...*/
   DateTime creationDate = DateTime.Now;
   /*...*/
   public DateTime CreationDate { get { return creationDate; } }
}

空对象

如果要实现类的if,则映射到字段会很有用。因为在映射到属性时无法(轻松)执行此操作。最终必须在数据库中存储假对象

HQL

我不确定使用HQL查询时,如果使用字段访问方法,您是否必须更改属性名称。例如,如果使用
,我认为您仍然可以从Person where FirstName=:name“”编写
,因为它仍然会使用属性名称

可以找到关于字段策略和空对象的进一步讨论

性能

与上的字段和属性的性能相关 在中端结果集较小的情况下,性能似乎没有太大问题


总之,根据场景的不同,每种方法都有一些可能有用的额外功能(字段访问允许只读getter,不需要setter,当poco不需要任何特殊功能时,属性访问就可以工作,而且似乎是实际的方法。等等)

我直接映射到字段,这允许我使用属性设置器跟踪属性的脏状态。

我不明白,你能更具体一点吗?access=“field.camelcase”不是自动这样做吗?例如映射到Foo.foo1吗?你仍然可以使用“from Foo where foo1=…”进行查询?是的,这就是我的意思。在你问题中的示例中,你实际上是映射到一个属性,并且只将setter映射到字段。我很好奇:你如何增强你的BO设计?我过去的问题是,当我映射到prope时,在属性中强制执行的业务规则或关系阻碍了持久性rties。您可以在这里的问题中看到我以前的(糟糕的)解决方案: