HBM 映射字段和 属性
HBM mapping both field and property
我有以下 class:
public class Foo
{
//...
protected int? someData;
public int? SomeData
{
get {return someData;}
set {someData = value;}
}
//...
}
此 class 映射到 HBM 文件中:
<class name="Foo" table="Foo">
//....
<property name="someData" access="field" column="SOME_DATA" />
//....
</class>
由于遗留原因,列被映射到不可访问的字段(小写)(不是 public 属性 - 大写)。
这些小写映射作为 HQL 字符串、基于条件的查询等的一部分在项目中多次使用。几乎不可能找到所有用法。
问题是这样的用法使得即使在简单的 lambda 上也无法使用:
session.Query<Foo>().Select(f=>f.SomeData)
抛出错误,因为大写 "SomeData" 未映射,而
session.Query<Foo>().Select(f=>f.someData)
不编译,因为小写 "someData" 受保护。
如果我同时映射两个字段和 属性:
会发生什么
<property name="someData" access="field" column="SOME_DATA" />
<property name="SomeData" access="property" column="SOME_DATA" />
我试的很快,好像可以,但是会不会有什么缺点?
是否有任何其他简单的解决方案,不需要编辑项目中每个基于条件的查询?
感谢您的帮助。
您可以多次映射同一列,但对于最新的 NHibernate 版本,只有一个属性需要映射为可修改的。因此,只需将 insert="false" update="false"
添加到您的附加映射中,以避免将来出现任何问题:
<property name="someData" access="field" column="SOME_DATA" />
<property name="SomeData" access="property" column="SOME_DATA" update="false" insert="false" />
我有以下 class:
public class Foo
{
//...
protected int? someData;
public int? SomeData
{
get {return someData;}
set {someData = value;}
}
//...
}
此 class 映射到 HBM 文件中:
<class name="Foo" table="Foo">
//....
<property name="someData" access="field" column="SOME_DATA" />
//....
</class>
由于遗留原因,列被映射到不可访问的字段(小写)(不是 public 属性 - 大写)。
这些小写映射作为 HQL 字符串、基于条件的查询等的一部分在项目中多次使用。几乎不可能找到所有用法。
问题是这样的用法使得即使在简单的 lambda 上也无法使用:
session.Query<Foo>().Select(f=>f.SomeData)
抛出错误,因为大写 "SomeData" 未映射,而
session.Query<Foo>().Select(f=>f.someData)
不编译,因为小写 "someData" 受保护。
如果我同时映射两个字段和 属性:
会发生什么<property name="someData" access="field" column="SOME_DATA" />
<property name="SomeData" access="property" column="SOME_DATA" />
我试的很快,好像可以,但是会不会有什么缺点?
是否有任何其他简单的解决方案,不需要编辑项目中每个基于条件的查询?
感谢您的帮助。
您可以多次映射同一列,但对于最新的 NHibernate 版本,只有一个属性需要映射为可修改的。因此,只需将 insert="false" update="false"
添加到您的附加映射中,以避免将来出现任何问题:
<property name="someData" access="field" column="SOME_DATA" />
<property name="SomeData" access="property" column="SOME_DATA" update="false" insert="false" />