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

この動作の理由は、3つの同時設定/イベントの組み合わせに隠されています。

  • クラス自体は次のようにマップされますlazy
  • プロパティZippedAssembliesbyte [])は次のようにマップされますlazy
  • インスタンスとしてのエンティティは、NHibernateセッションから削除されました(たとえば、明示的なEvict(entity)によって、またはリクエスト間のWebセッションに保持することによって)。

これらすべてのイベントが同時に発生すると、NHibernateはそのようなエンティティを更新できません。(おそらく)大きなプロパティの遅延読み込みがサポートされているため、(削除後)私たちが持っているものは標準インスタンスではありませんZippedAssemblies

これを熱望する方法はいくつか考えられますが、私が提案するのは1つだけです。

このエンティティを更新するときはいつでも、それを再ロードし(Session.Get(ID))、そのプロパティを新しい値で変更します。エンティティを常にNHibernateセッションに保持します(Evict()なし、Session.Close()なし)。

そして、変更するZippedAssembliesかどうかにかかわらず、更新することができます。これは機能し、上記の場合に役立つ可能性があります。

于 2012-11-21T18:01:25.727 に答える