返回 POCO 而不是 SubSonic 的 ActiveRecord 对象的 SubSonic 数据层
Posted
技术标签:
【中文标题】返回 POCO 而不是 SubSonic 的 ActiveRecord 对象的 SubSonic 数据层【英文标题】:SubSonic data layer that returns POCOs instead of SubSonic's ActiveRecord objects 【发布时间】:2009-01-21 22:38:23 【问题描述】:我想在我正在构建的应用程序中使用 SubSonic (2.2),因为我喜欢它的简单性,并且它可以处理我可以预见需要的任何类型的查询。同时,我想让我的应用程序的上层与 Subsonic 类型分离。我想只返回普通的旧 C# 对象,并传入要保存的 POCO。
但这里有一个问题:我希望我的 POCO 具有基于 FK 关系的子集合和父对象的延迟加载属性。我想我需要以某种方式将 Subsonic SqlQuery 对象放在我的 POCO 的私有成员中,并在 getter 内部使用它来获取延迟加载的属性。
关于如何专门使用 SubSonic 实现这一点的任何想法?以前有人做过吗?
我确实意识到 SubSonic 的下一个主要版本将立即执行此操作,但看起来至少需要几个月的时间。
【问题讨论】:
【参考方案1】:我在 SubSonic 中使用 RepositoryRecord,它“主要是”poco。然后我为那些在选择属性时加载另一个类的类制作部分。
Partial Public Class Book
Private _Author as Database.Author
Property Author() as Database.Author
Get
If _Author is nothing then
' Load the author class here.
End if
return _Author
End get
Set
....
End Set
End Property
End Class
【讨论】:
【参考方案2】:你可以使用属性:
tableBaseClass="RepositoryRecord"
恐怕我不知道这是如何处理延迟加载的。您可以查看Rob Conery's post了解更多详情。
【讨论】:
我实际上已经尝试过这个选项,但是 RepositoryRecord 是 SubSonic 的东西,因此我仍然会与 Subsonic 耦合。我还尝试将我自己的基类指定为“tableBaseClass”,但这不起作用,因为我从生成的文件中得到了很多构建错误。【参考方案3】:您想要的不在 2.x 版本中。您可以通过编辑模板来获得大部分方法(我有延迟加载属性的示例on my blog)。另一种选择是构建您的 pocos,然后构建类以从 SubSonic 生成的类和查询映射到您的模型。
【讨论】:
【参考方案4】:想不出一个好的方法来做到这一点。 Subsonic 3 看起来很不错,可以解决问题,但同时我们只是 went with NHibernate。
【讨论】:
以上是关于返回 POCO 而不是 SubSonic 的 ActiveRecord 对象的 SubSonic 数据层的主要内容,如果未能解决你的问题,请参考以下文章
C# XslCompiledTransform - 以 POCO 形式而不是 Html 输出