nHibernate“;“无持久性”;关于更新惰性属性

nHibernate“;“无持久性”;关于更新惰性属性,nhibernate,proxy,lazy-loading,Nhibernate,Proxy,Lazy Loading,我要去拿 “映射执行选项:ProjectNameImportTypeProxy没有持久化程序” 在实体上,但仅在更新它时 我的意思是,我创建的实体没有问题。如果我重新加载并再次保存它,则会出现异常,这意味着映射实际上是正确的 如果删除lazy=“true”映射选项,则不会出现此错误 这是映射: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

我要去拿

“映射执行选项: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; }
}
//
///表示projectName导入类型
/// 
[UniquentityKey(“代码”)]
公共类ProjectNameImportType:ModelEntityBase
{
/// 
///获取和设置代码
/// 
[必需]
[StringLength(255)]
公共虚拟字符串代码{get;set;}
/// 
///获取并设置名称
/// 
[必需]
[StringLength(255)]
公共虚拟字符串名称{get;set;}
/// 
///获取并设置描述
/// 
[秘书长(2000年)]
公共虚拟字符串描述{get;set;}
/// 
///获取和设置文件共享
/// 
[必需]
[秘书长(2000年)]
公共虚拟字符串文件共享{get;set;}
/// 
///获取并设置压缩的资产数据
/// 
[必需]
公共虚拟字节[]压缩程序集{get;set;}
/// 
///获取并设置文件名
/// 
[必需]
[StringLength(255)]
公共虚拟字符串文件名{get;set;}
}

我做错了什么?

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

  • 类本身被映射为
    lazy
  • 属性
    zippedsassemblies
    (字节[])映射为
    lazy
  • 将实体作为实例从NHibernate会话中逐出(例如,通过显式逐出(实体)或将其保留在请求之间的web会话中)
当所有这些事件同时发生时,NHibernate无法更新这样的实体。我们拥有的(收回后)不是标准实例,因为支持(很可能)大型属性的延迟加载
zippedsassemblies

有一些可能的场景可以避免这种情况,但我只建议其中一种:

每当您想要更新此实体时,都要重新加载它(Session.Get(ID)) 并使用新值更改其属性。将实体保存在NHibernate中 会话(无逐出()无会话。关闭()


然后,您可以在更改或不更改
zippedAssembly
时对其进行更新。这将在上述情况下起作用并可能有所帮助。

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

  • 类本身被映射为
    lazy
  • 属性
    zippedsassemblies
    (字节[])映射为
    lazy
  • 将实体作为实例从NHibernate会话中逐出(例如,通过显式逐出(实体)或将其保留在请求之间的web会话中)
当所有这些事件同时发生时,NHibernate无法更新这样的实体。我们拥有的(收回后)不是标准实例,因为支持(很可能)大型属性的延迟加载
zippedsassemblies

有一些可能的场景可以避免这种情况,但我只建议其中一种:

每当您想要更新此实体时,都要重新加载它(Session.Get(ID)) 并使用新值更改其属性。将实体保存在NHibernate中 会话(无逐出()无会话。关闭()


然后,您可以在更改或不更改
zippedAssembly
时对其进行更新。这将起作用,并且在上述情况下可能会有所帮助。

能否显示更新的代码?能否显示更新的代码?