NHibernate:映射到字段或属性?

时间:2008-09-24 20:31:09

标签: .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" column="FOO_1" type="string" length="50" />
    <property name="FooProperty2" column="FOO_2" type="string" length="50" />
    [...]
  </class>
</hibernate-mapping>

当然,请解释原因:)

通常,我映射到属性,但映射到字段可以在属性的getter / setter中放置一些“逻辑”。

映射到字段是否“糟糕”?有最好的做法吗?

7 个答案:

答案 0 :(得分:5)

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

这让我看起来很漂亮,例如“来自FirstName ='John'的人,而不是像”来自于firstName / _firstName的人“这样的东西,并且在为我的实体保湿时也避免使用setter逻辑。

答案 1 :(得分:2)

属性在您需要对数据执行时,因为它进入和退出持久存储时也很有用。通常应该避免这种情况,但是一些罕见的商业案例或遗留支持有时会要求这样做。

(请记住,如果你在使用getter返回时以某种方式转换数据,NHibernate将(默认情况下)使用getter的返回并将其保存回数据库当会话被刷新/关闭时。确保这是你想要的。)

答案 2 :(得分:1)

我映射到属性,我没有遇到过我会映射到某个字段的情况......当我有我扩充我的B.O.为需求而设计。我认为它允许更好的架构。

答案 3 :(得分:1)

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

除了集合(例如set s。那些我映射到字段(access="field.camelcase-underscore")的那些因为我没有暴露它们的公共属性,而是方法。

答案 4 :(得分:1)

空对象

如果要在类中实现null object pattern,则映射到字段会很有用。因为映射到Properties时无法轻松执行此操作。您最终必须在数据库中存储虚假对象。

<强> HQL

我不确定使用HQL查询时,如果使用字段访问方法,则必须更改属性名称。即如果你有<property name="FirstName" access="field.camelcase" />我认为你仍然可以写"From Person where FirstName = :name";,因为它仍会使用属性名称。

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

<强>性能

关于John Chapman's blog上字段与财产的表现 看起来中小型结果集的性能没有太大问题。

总之,根据场景,每种方法都有一些特殊的好处(字段访问允许只读getter,不需要setter,属性访问工作,当你的poco不需要特殊的东西,似乎是事实上的方法。等)

答案 5 :(得分:0)

我倾向于同意上面的答案。通常,映射到几乎所有内容的属性,然后映射到集合设置器的字段 你想要映射到字段的唯一其他地方就是你有什么东西:

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

答案 6 :(得分:0)

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