1

我得到了

“MappingExecption: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; }
}

我究竟做错了什么?

4

1 回答 1

4

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

  • 类本身被映射为lazy
  • 属性ZippedAssembliesbyte[])映射为lazy
  • 实体作为实例被从 NHibernate 会话中驱逐(例如,通过显式 Evict(entity) 或通过将其保持在请求之间的 Web 会话中)。

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

有一些可能的情况如何实现这一点,但我只建议一个:

每当您想更新此实体时,请重新加载它 (Session.Get(ID)) 并使用新值更改其属性。始终将实体保持在 NHibernate 会话中(没有 Evict() 没有 Session.Close())。

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

于 2012-11-21T18:01:25.727 回答