使用 NHibernate 在延迟加载场景中使用 Castle.DynamicProxy 实现 IDataErrorInfo

2024-04-21

我已经使用 Castle.DynamicProxy IIterceptor 实现了 IDataErrorInfo 接口。我还实现了一个 NHibernate 拦截器,它使用该拦截器实例化我的实体。问题在于延迟加载的实体。这些是使用 nhibernate 配置文件中指定的代理工厂类构造的,它显然不提供 IDataErrorInfo 实现。该代理通过我的拦截器掩盖了 IDataErrorInfo 的底层实现,这导致验证失败。

这个问题有哪些可能的解决方案?

(解决该问题的一种方法是更改​​ nhibernate 使用的默认代理工厂。)


一种解决方案是覆盖默认的 Castle 代理工厂并使用 IDataErrorInfo 扩展接口数组。 LazyInitializer 实际上并没有实现这个接口,它只是将调用转发到我们自己的代理实现。这DataBindingProxyFactory然后必须注册为 NHibernate 代理工厂。

 public class DataBindingProxyFactory : ProxyFactory, IProxyFactoryFactory
  {
    public IProxyValidator ProxyValidator { get { return new DynProxyTypeValidator(); } }

    public IProxyFactory BuildProxyFactory()
    {
      return new DataBindingProxyFactory();
    }

    public bool IsInstrumented(Type entityClass)
    {
      return true;
    }

    public override INHibernateProxy GetProxy(object id, ISessionImplementor session)
    {
      try
      {
        var initializer = new LazyInitializer(EntityName, PersistentClass, id, GetIdentifierMethod,
          SetIdentifierMethod, ComponentIdType, session);

        var interfaces =
          new List<Type>(Interfaces){
            typeof (INotifyPropertyChanged),
            typeof (IDataErrorInfo)
          }.ToArray();

        var generatedProxy = IsClassProxy
          ? DefaultProxyGenerator.CreateClassProxy(PersistentClass, interfaces, initializer)
          : DefaultProxyGenerator.CreateInterfaceProxyWithoutTarget(Interfaces[0], interfaces,
            initializer);

        initializer._constructed = true;
        return (INHibernateProxy) generatedProxy;
      }
      catch (Exception e)
      {
        log.Error("Creating a proxy instance failed", e);
        throw new HibernateException("Creating a proxy instance failed", e);
      }
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NHibernate 在延迟加载场景中使用 Castle.DynamicProxy 实现 IDataErrorInfo 的相关文章

  • 如何通过 HttpContext 访问 Blazor Server .Net 6 中的 cookie?

    不幸的是 有关在 Blazor Server 中访问 c ookie 的教程和之前的 StackOverflow 答案似乎在新的 Net 版本中变得无效 例如 我无法获得以下任一答案 根据 net 6 中没有的评论来判断 如何在服务器端 B
  • 我仍然没有获得代表

    使用委托不是可以帮助处理一些异步情况吗 我尝试了以下操作 但我的用户界面仍然挂起 你到底什么时候使用代表 Public Class Form1 Private Delegate Sub testDelegate Private Sub Bu
  • 获取ADO.NET中的参数前缀

    我想使用列名作为参数基于列列表生成多个 SQL 语句 Edit C var columns new string COL1 COL2 var tableName TABLE 1 var prefix TODO get this from t
  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • WCF - 进行多次调用时随机客户端超时

    我有一个WPF客户端通过以下方式请求数据WCF服务托管于IIS 7 服务方法调用存储过程 SQL 2012 using EF检索一些数据 由于需要加载大量数据 因此客户端会多次调用服务方法 以 分解 数据加载并避免大量负载和超时 我们使用生
  • 就地修改 XML 文件?

    假设我有以下 XML 文件
  • WPF DataGrid DataBindingComplete 事件在哪里?

    数据绑定完成后 我需要采取一些操作 例如 根据其他一些单元格使某些单元格只读 在WinForm DataGridView中 我曾经在DataBindingComplete事件中执行此操作 但是 我在 WPF DataGrid 中找不到这样的
  • 为什么人们在 ICommand 上使用 CommandManager.InvalidateRequerySuggested()?

    我正在制作自己的一些自定义 ICommand 实现 我看到很多实现都是这样的 public event EventHandler CanExecuteChanged add CommandManager RequerySuggested v
  • asp.net-mvc 中模型绑定双精度的 CultureInfo 问题(2)

    在我的 Jquery 脚本中 我使用浏览器的 CultureInfo en UK 发布了两个双打 该浏览器使用 作为分数分隔符 我的 MVC 应用程序在区域设置为 nl BE 的服务器上运行 使用 作为分数分隔符 AcceptVerbs H
  • 如何使用 C# 从 Kafka 获取主题列表

    我想从卡夫卡获取主题列表 我正在使用 kafka net 客户端 但无法在有关获取主题列表的文档中找到 您可以使用 Confluence Kafka 包中提供的 AdminClient 列出所有主题 using Confluent Kafk
  • 允许 WPF Web 浏览器中的弹出窗口

    有没有办法允许在嵌入式 WPF WebBrowser 控件中弹出窗口 我没有找到别人的解决方案 也没有找到允许弹出窗口的COM接口 我不想更改用户注册表设置或使用类似的侵入方法 因为应用程序旨在通过 ClickOnce 分发 您可以通过处理
  • 如何使用代码隐藏创建 StackPanel -> 边框 -> 背景

    我正在尝试设置 a 的属性TreeViewItem gt StackPanel在 C 中就像这个问题 https stackoverflow com questions 8203316 adding content to a treevie
  • WPF 自定义控件不可见

    当我在 WPF 中创建自定义控件并将其添加到窗口时 我在对话框中看不到任何放置它的内容 这就是我正在做的 创建一个新的 WPF 应用程序 添加 gt 新项目 gt 自定义控件 WPF CustomButton cs 我将 CustomBut
  • 如何确定服务器端的浏览器窗口大小 C#

    如何获取当前打开的浏览器屏幕窗口的准确高度和宽度 您可以使用 Javascript 来获取视口的宽度和高度 然后通过隐藏表单输入或 ajax 将值传回 最简单的 var width window width var height windo
  • 合并多个列表

    鉴于我有一个列表列表 List
  • 绑定到多个索引器

    我正在尝试将索引属性与两个索引器绑定 该属性看起来像这样 public Item this int x int y get return items x y set items x y value 根据http msdn microsoft
  • Spring Data、JPA @OneToMany Lazy fetch 在 Spring Boot 中不起作用

    I have OneToMany之间的关系FabricRoll and FabricDefect OneToMany cascade CascadeType ALL fetch FetchType LAZY JoinColumn name
  • 在大型数据绑定 ObservableCollection 中添加/删除许多项目,而无需冻结 GUI

    我和我的团队正在开发一个 WPF 应用程序 该应用程序显示多个并发 XamDataChart 控件 由 Infragistics 提供 每个图表都绑定到不同的 ObservableCollection 最多可包含 200 万个点 对于每个图
  • 最佳实践:从属性中抛出异常

    什么时候适合从属性 getter 或 setter 中抛出异常 什么时候不合适呢 为什么 关于这个主题的外部文档的链接会很有帮助 谷歌搜索结果出奇的少 Microsoft 在以下位置提供了有关如何设计属性的建议 http msdn micr
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象

随机推荐

  • 如何在 Java 中获取英国夏令时偏移 (BST)

    在英国 我想获取当前与 UTC GMT 的偏移量 目前偏移量是1小时 但似乎没有办法找到这个 Code TimeZone timeZone TimeZone getDefault logger debug Timezone ID is ti
  • 模板化 lambda 的显式实例化[重复]

    这个问题在这里已经有答案了 我刚刚遇到显式实例化模板 lambda 的问题 下面的代码无法编译 但我无法弄清楚这种情况下出了什么问题
  • 如何删除所有超过 2 天的空文件夹?

    我制作了一个脚本 删除路径中带有子文件夹的所有空文件夹 现在我必须做的是 如果一个文件夹是 2 天前创建的 并且它是空的 则应该将其与其他早于 2 天的空文件夹一起删除 如果不是 则不应删除它 我还需要 想要将已删除的文件夹写入日志中 我用
  • ERM:三元关系中的基数

    如何读取和 或指定实体关系模型 陈表示法 三元关系中的基数 最小 最大 例如 一位领导与他的相关员工一起考察了多项资格认证 现在 我想知道如何在最小 最大 表示法中指定基数 这是给定基数的另一个示例 我想知道如何阅读它 三元关系可以解读为
  • 选择组合框项目时启用文本框

    我想在选择组合框项时启用文本框 请注意 组合框项目未定义 而是我在组合框中使用项目源来获取组合框项目的列表 我想在选择组合框项目时更改文本框的属性 评论粘贴到原始问题
  • 为什么会话 cookie 在从域提供服务时有效,但在使用 IP 时却无效?

    我有一个 Flask 应用程序 其中的会话在我的本地开发计算机上运行良好 但是 当我尝试将其部署在亚马逊服务器上时 会话似乎不起作用 更具体地说 未设置会话cookie 不过 我可以设置普通的 cookie 我确保我有一个静态安全密钥 正如
  • 为对象序列提供 JsonFormat

    我试图在这里找到一些帮助来应用 DefaultJsonProtocol 的 JsonFormat 扩展 包含对象序列的类 所以对于课程来说 class Person val name String val adresses Seq Adre
  • 如何在oracle DB中存储日文字符?

    我想将日语 或任何语言 字符存储在我的 Oracle 数据库表的一列中 我使用 varchar2 作为数据类型 当我尝试将此字符 插入到该列时 它存储为 不知道该怎么办 需要帮忙 Note 我尝试将数据类型更改为 nvarchar2 仍然不
  • 适用于 Windows 的 SVN 挂钩

    我用谷歌搜索了一下 发现确实没有适用于 Windows 的 SVN hooks 资源 所以我想我应该在这里创建一个维基来集中它 如果您贡献 请务必注明 钩子的名称 脚本的作用 实际脚本 注意 我怀疑发布史诗般的脚本不会有用 防止提交空注释
  • 具有 Jetty 连接器的 Restlet 2.0.8 不会恢复 SSL 会话,而 Simple 连接器会恢复 SSL 会话

    有谁知道这是为什么 或者如何解决它 我正在使用 android 通过 httpclient 连接 简单连接器恢复连接很好 但 Jetty 每次都会执行新的握手 代码是相同的 这只是我在构建路径上获得的连接器 不断地重做握手会消耗大量的数据和
  • 如何使弹丸转弯时带有弧线

    我有一门大炮 可以以抛物线弧线发射子弹 现在 当我发射子弹时 子弹的旋转速度与从大炮中发射时的旋转速度相同 如何使子弹在空气中飞行时沿着弧线旋转 我尝试了以下作为在项目符号上运行的脚本 附件1 public class PointingBe
  • SQL Server Reporting Services 2008 R2 始终显示登录提示

    每当我尝试通过 URL 访问 SSRS 2008 R2 即在网络上发布后 时 访问报告时总是显示登录提示 开发环境中不会出现该问题 如何防止在我尝试访问报告时显示此登录提示 目前 我们正在通过提供用户名和密码来解决这个问题
  • 模拟器未切换到下一个活动

    我对 Android 编程完全陌生 我正在做一个简单的应用程序 其中显示启动屏幕 然后显示登录屏幕 问题是模拟器不会超出启动屏幕 Android 清单
  • Groovy - XmlNodePrinter 打印空白文件

    我正在尝试将格式化的 xml 打印到文件中 但我的 XmlNodePrinter 仅打印一个空白文件 我认为我传入的 xml 对象已正确填充 我可以使用 StreamingMarkupBuilder 打印它 但它的格式全部在一行上 我不知道
  • 如何设置 Xamarin Picker 中项目列表的样式(在 Android 中)

    我有一个 Xamarin Android 应用程序 它使用选取器从值列表中进行选择 我一直在改变应用程序的风格 但遇到了选择器的问题 虽然我可以设置 TextColor 但无法设置占位符文本的颜色 在搜索帮助后 我实现了一个自定义渲染器 现
  • Jekyll:不允许操作@apply2files

    我正在使用 Windows 10 的 Linux 子系统 我在其中安装了 Jekyll 但是当我运行时bundle exec jekyll serve它给了我 jekyll 3 8 6 Error Operation not permitt
  • 检测视口单元(使用modernizr或普通js)并提供适当的样式表

    实际上 三周以来我一直在尝试解决一个问题 我正在尝试测试对大众单位的支持 并在浏览器不支持该单位时提供单独的样式表 我阅读了modernizr教程并且熟悉modernizr css检测 但是我在网上没有找到vh单位 视口相对单位 的测试 所
  • 不同子域上的会话 cookie 是否算作第 3 方?

    假设我有一个网站www example com其中有一个 IFRAME 指向 ASP NET 站点myapp othersite com 据我所知 这会导致会话和第三方 cookie 出现问题 如果我将嵌入式应用程序移至myapp exam
  • Python 格式化小数,具有最少小数位数

    我有一些DecimalPython 中的实例 我希望将它们格式化为 Decimal 1 gt 1 00 Decimal 12 0 gt 12 00 Decimal 314 1 gt 314 10 Decimal 314 151 gt 314
  • 使用 NHibernate 在延迟加载场景中使用 Castle.DynamicProxy 实现 IDataErrorInfo

    我已经使用 Castle DynamicProxy IIterceptor 实现了 IDataErrorInfo 接口 我还实现了一个 NHibernate 拦截器 它使用该拦截器实例化我的实体 问题在于延迟加载的实体 这些是使用 nhib