Zam*_*oni 5 versioning nhibernate filter nhibernate-mapping
使用NHibernate我想过滤一个类中的集合,只包含可能对象的子集.下面我将包括一个示例表数据以帮助解释.我无法使用NHibernate找到这个.
11 "data.txt" 2
12 "info.txt" 3
Run Code Online (Sandbox Code Playgroud)
31 "Genesis" 1 11 <= Ignore this object
32 "Changed data" 2 11 <= Get this object
34 "Genesis" 1 12 <= Ignore this object
35 "Changed info" 2 12 <= Ignore this object
36 "Added info" 3 12 <= Get this object
Run Code Online (Sandbox Code Playgroud)
我想在一个命令中为每个DataObject加入非外键DataObject.CurrentVersion = DataObjectVersion.VersionNumber.
以下是类和映射文件:
public class DataObject
{
public virtual int DataObjectId { get; set; }
public virtual string Name { get; set; }
public virtual int CurrentVersionNumber { get; set; }
public virtual IList<DataObjectVersion> Versions { get; set; }
}
<class name="DataObject" table="DataObject" lazy="false">
<id name="DataObjectId" column="DataObjectId" type="int">
<generator class="assigned" />
</id>
<property name="Name" column="Name" type="String(512)" />
<property name="CurrentVersionNumber" column="CurrentVersionNumber" type="int" />
<bag name="Versions" cascade="all-delete-orphan" inverse="true" lazy="false" >
<key column="DataObjectId" />
<one-to-many class="DataObjectVersion" />
</bag>
</class>
public class DataObjectVersion
{
public virtual int DataObjectVersionId { get; set; }
public virtual string Comment { get; set; }
public virtual int VersionNumber { get; set; }
public virtual int DataObjectId { get; set; }
}
<class name="DataObjectVersion" table="DataObjectVersion" lazy="false">
<id name="Id" column="DataObjectVersionId" type="int">
<generator class="assigned" />
</id>
<property name="Comment" column="Comment" type="String(512)" />
<property name="VersionNumber" column="VersionNumber" type="int" />
<property name="DataObjectId" column="DataObjectId" type="int" />
</class>
Run Code Online (Sandbox Code Playgroud)
Jag*_*uar 11
如果要按需过滤集合,使用过滤器是一个有效的选择.您需要在Version类和bag元素中声明过滤器,并应用NHibernateSession.EnableFilter方法中的过滤器
如果您总是想要在包中获取单个版本,那么在包的映射中实现"where":
<bag name="Versions" cascade="all-delete-orphan" inverse="true" lazy="false" where="CurrentVersionNumber = Versions.VersionNumber" >
<key column="DataObjectId" />
<one-to-many class="DataObjectVersion" />
</bag>
Run Code Online (Sandbox Code Playgroud)
请注意,在'where'中你编写了正确的SQL而不是HQL,因此上面写的正确的SQL可能必须更改以反映你的模式
另外,如果要获取单个对象,则设置一个包,并且相应的IList可能是过度杀伤.在类中应用公式属性和DataObjectVersion对象可能更合适
在类DataObject中用.替换IList
public virtual DataObjectVersion Version { get; set; }
Run Code Online (Sandbox Code Playgroud)
并在映射中将'bag'替换为行中的某些内容
<property name="Version" type="DataObjectVersion" update="false" insert="false" formula="(select v.DataObjectVersionId, v.Comments, v.VersionNumber, v.DataObjectId from DataObjectVersion v where v.VersionNumber = CurrentVersionNumber)" />
Run Code Online (Sandbox Code Playgroud)
再次只允许适当的SQL
我已经使用了本机数据类型的计算属性(日期时间,字符串等),并且获取实体可能(或可能不)需要更多或更多的东西
最后但并非最不重要的,您可以通过在集合上创建过滤器来获取主对象DataObject 后对集合应用过滤器
IList<DataObjectVersion> fVersion =
NHibernateSession.CreateFilter(do.Versions, "where VersionNumber = :ver")
.SetParameter("ver", do.CurrentVersionNumber)
.List<DataObjectVersion>();
Run Code Online (Sandbox Code Playgroud)
do.Versions集合未初始化的地方,只有在单独的fVersion集合中获取的结果,这是在已经为数据对象提取进行数据包往返之后的第二个SELECT.
归档时间: |
|
查看次数: |
5804 次 |
最近记录: |