nHibernate "No persister for"更新惰性属性



我正在获取

"映射执行:ProjectNameImportTypeProxy没有持久性">

实体上的

,但仅在更新时

我的意思是,我创建的实体没有问题。如果我重新加载并再次保存它,我会得到异常,这意味着映射实际上是正确的。。

如果删除lazy="true"映射选项,则不会出现此错误。

这是映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ProjectName"
namespace="Projects.ProjectName.Model">
<class name="ProjectNameImportType" table="mid_ProjectNameImportTypes">
<id name="ID" column="ID">
<generator class="hilo"/>
</id>
<property name="Code" length="255" not-null="true" index="idx_ProjectNameImportType_Code"/>
<property name="Name" length="255" not-null="true" />
<property name="Description" length="2000" />
<property name="FilesShare" length="2000" not-null="true" />
<property name="ZippedAssemblies" lazy="true" type="BinaryBlob" not-null="true" />
<property name="FileName" length="255" not-null="true" />
</class>
</hibernate-mapping>

这就是

/// <summary>
/// Represents a projectName import type
/// </summary>
[UniqueEntityKey("Code")]
public class ProjectNameImportType : ModelEntityBase
{
/// <summary>
/// Get and set code
/// </summary>
[Required]
[StringLength(255)]
public virtual string Code { get; set; }
/// <summary>
/// Get and set name
/// </summary>
[Required]
[StringLength(255)]
public virtual string Name { get; set; }
/// <summary>
/// Get and set description
/// </summary>
[StringLength(2000)]
public virtual string Description { get; set; }
/// <summary>
/// Get and set files share
/// </summary>
[Required]
[StringLength(2000)]
public virtual string FilesShare { get; set; }
/// <summary>
/// Get and set zipped assemplies data
/// </summary>
[Required]
public virtual byte[] ZippedAssemblies { get; set; }
/// <summary>
/// Get and set filename
/// </summary>
[Required]
[StringLength(255)]
public virtual string FileName { get; set; }
}

我做错了什么?

此行为的原因隐藏在三个并发设置/事件的组合中:

  • 类本身被映射为lazy
  • 属性ZippedAssemblies(byte[])被映射为lazy
  • 实体作为实例从NHibernate会话中被逐出(例如,通过显式逐出(实体)或通过在请求之间将其保持在网络会话中)

当所有这些事件一起发生时,NHibernate无法更新这样的实体。我们所拥有的(在逐出之后)不是标准实例,因为支持(很可能)大属性ZippedAssemblies的延迟加载

有一些可能的场景如何热衷于此,但我只建议一个:

如果要更新此实体,请重新加载它(Session.Get(ID))并使用新值更改其属性。将实体保留在NHibernate中会话(无Evict()无session.Close())。

然后您可以在更改或不更改ZippedAssemblies时更新它。这将起作用,并可能有助于上述情况。

最新更新