c# - NHibernate:无状态 session 错误消息无法获取代理

标签 c# nhibernate

我正在使用 nHibernate 无状态 session 来获取对象、更新一个属性并将对象保存回数据库。

我不断收到错误信息:

proxies cannot be fetched by a stateless session

我在其他地方也有类似的代码,所以我不明白为什么它不起作用。有谁知道问题出在哪里?

我正在尝试更新 ScreenLockVersion 属性。

映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="ApplicationUtilities"
                  namespace="ApplicationUtilities.Concurrency">
  <class name="Screen" table="concurrency_screen" dynamic-update="true" optimistic-lock="all">
    <id name="ID" column="screenID">
      <generator class="identity" />
    </id>
    <property name="ScreenName" column="screenName" />
    <property name="SubScreenName" column="subScreenName" />
    <property name="ScreenLockID" column="screenLockID" />
    <property name="ScreenLockVersion" column="screenLockVersion" />
    <property name="ScreenLockRequired" column="screenLockRequired" />
    <many-to-one name="Parent" class="Screen" column="parentScreenID" />
    <many-to-one name="Identity" class="ApplicationUtilities.SystemIdentity.Identity" column="identityID" />
    <many-to-one name="Application" class="ApplicationName" column="applicationID" />
    <one-to-one name="LastModified" class="LastModified" property-ref="Screen" cascade="all" />
    <bag name="AffectedScreens" table="concurrency_affectedScreen" cascade="all">
      <key column="updatedScreenID" />
      <many-to-many column="affectedScreenID" class="Screen" />
    </bag>
    <bag name="ChildScreens" table="concurrency_screen">
      <key column="parentScreenID" />
      <many-to-many column="screenID" class="Screen" />
    </bag>
  </class>
</hibernate-mapping>

代码:

public class Screen : BaseDomain
{
    private string screenName;
    private string subScreenName;
    private Screen parent;
    private IList<Screen> childScreens = new List<Screen>();
    private IList<Screen> affectedScreens = new List<Screen>();
    private Guid screenLockID;
    private int screenLockVersion;
    private bool screenLockRequired;
    private LastModified lastModified;
    private Identity identity;
    private ApplicationName application;

    protected Screen()
    {
        this.parent = null;
        this.screenLockRequired = false;
    }

    /// <summary>
    /// Create new parent screen
    /// </summary>
    /// <param name="screenName">parent screenname</param>
    public Screen(string screenName, ApplicationName application)
    {
        this.screenName = screenName;
        this.subScreenName = null;
        this.parent = null;
        this.application = application; 
    }

    /// <summary>
    /// Create new subscreen
    /// </summary>
    /// <param name="screenName">parent screen name</param>
    /// <param name="subScreenName">subscreen name</param>
    /// <param name="parent">reference to parent screen</param>
    public Screen(string screenName, string subScreenName, Screen parent, ApplicationName application)
    {
        this.screenName = screenName;
        this.subScreenName = subScreenName;
        this.application = application; 
        this.parent = parent;
    }

    #region Properties
    public virtual IList<Screen> AffectedScreens
    {
        get { return affectedScreens; }
        set { affectedScreens = value; }
    }

    public virtual Screen Parent
    {
        get { return parent; }
        set { parent = value; }
    }

    public virtual IList<Screen> ChildScreens
    {
        get { return childScreens; }
        set { childScreens = value; }
    }

    public virtual string ScreenName
    {
        get { return screenName; }
        set { screenName = value; }
    }

    public virtual string SubScreenName
    {
        get { return subScreenName; }
        set { subScreenName = value; }
    }

    public virtual Guid ScreenLockID
    {
        get { return screenLockID; }
        set { screenLockID = value; }
    }

    public virtual int ScreenLockVersion
    {
        get { return screenLockVersion; }
        set { screenLockVersion = value; }
    }

    public virtual bool ScreenLockRequired
    {
        get
        {
            if (parent != null)
                return parent.ScreenLockRequired;
            else
                return screenLockRequired; 
        }
        set { screenLockRequired = value; }
    }

    public virtual LastModified LastModified
    {
        get { return lastModified; }
        set { lastModified = value; }
    }

    protected internal virtual Identity Identity
    {
        get { return identity; }
        set { identity = value; }
    }

    public virtual ApplicationName Application
    {
        get { return application; }
        set { application = value; }
    }
    #endregion

    #region Methods
    public override string ToString()
    {
        return ScreenName + SubScreenName;
    }

    public override bool Equals(object obj)
    {
        Screen other = obj as Screen;

        if (other == null)
            return false;

        if (string.IsNullOrEmpty(SubScreenName))
        {
            if(string.IsNullOrEmpty(other.SubScreenName))
                return ScreenName.Equals(other.ScreenName) && Application.Equals(other.Application);
            else
                return false;
        }
        else if (string.IsNullOrEmpty(other.SubScreenName))
            return false;
        else
            return ScreenName.Equals(other.ScreenName) && SubScreenName.Equals(other.SubScreenName) && Application.Equals(other.Application);
    }

    public override int GetHashCode()
    {
        if(SubScreenName == null)
            return ScreenName.GetHashCode() ^ Application.GetHashCode();
        else
            return ScreenName.GetHashCode() ^ SubScreenName.GetHashCode() ^ Application.GetHashCode();
    }
    #endregion
}

最佳答案

无状态 session 不支持延迟加载。您需要尽早加载您的 Screen 实体(在同一查询中,您当前仅加载代理)。

关于c# - NHibernate:无状态 session 错误消息无法获取代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8143609/

相关文章:

c# - Web 浏览器控件 : Navigation to the webpage was canceled

c# - 使用 (Fluent-)NHibernate 持久化简单树会导致 System.InvalidCastException

c# - UnitOfWork (NHibernate),一次只有一个事件的 UoW/ session ? (需要建议)

nhibernate - 使用 NHibernate 执行存储过程

c# - "Count()"上的 "Take()"之后的 "IQueryable"返回错误结果?

c# - 具有初始化方法的类或静态类的全局实例

c# - 打开自定义文件,args 始终为空

c# - 如何以编程方式清除 Kerberos 票证缓存

c# - 何时在 ASP.NET Core 5 中处理 DbContext 实例

sqlite - NHibernate SchemaUpdate 从不更新我的架构