【问题标题】:How to override record table naming to access existing data in Orchard CMS如何覆盖记录表命名以访问 Orchard CMS 中的现有数据
【发布时间】:2011-08-11 13:03:41
【问题描述】:

我需要访问预先存在的表中的数据。我已经开始通过创建一个模块来显示数据等。但是,Orchard 使用“Table_Prefix”和“模块名称”作为表命令的前缀。

有什么办法可以指定绑定模型的表,这样就可以使用现有的IRepository

我试图避免修改核心代码,或者实现我自己的 IRepository(我觉得这是我必须要做的事情。)

提前致谢。

【问题讨论】:

  • 您能说得更具体一点吗?您要访问哪些表数据,为什么? Orchard 以一种您甚至不需要知道在大多数情况下都有一个 SQL 表的方式完成,并提供服务来访问大多数内容作为 CLR 对象,而不是作为表行。
  • 如问题所述,我需要访问现有数据。我很感激我正在通过 ORM 工作。查看源代码后,我可以看到绑定是通过 Fluent NHibernate!s 自动映射完成的,该自动映射按约定工作。我从 Orchard 论坛发现了另一个类似的问题,它指出唯一的方法是为外部数据创建一个 DAL。

标签: asp.net asp.net-mvc nhibernate fluent-nhibernate orchardcms


【解决方案1】:

您可以通过三种方式更改核心代码来创建自定义表命名约定(使其适合您当前的命名):

  1. 记录名称映射是在BuildRecord 方法中创建的 CompositionStrategy班级 (Orchard.Framework/Environment/ShellBuilders/CompositionStrategy),因此您可以简单地在此处修改代码。
  2. 通过更改Apply 类的Apply 方法。这是记录表名称映射(在第 1 点中内置)被推送到 NHibernate 的地方。
  3. 创建自己的FluentNHibernate.Conventions.IClassConvention实现(类似于上面提到的RecordTableNameConvention,并用它替换Orchard.Data.Providers.AbstractDataServicesProviderCreatePersistenceModel(...)方法中AutoMap使用的默认实现。

您也可以创建自己的 IDataServicesProvider 实现,但如果您只需要更改表命名约定,那肯定是大材小用。

【讨论】:

  • 感谢您的回答。最后我最终使用了自己的存储库,因为我处理的表的命名约定与自动映射部分 Orchard 使用的命名约定不同。但是,我可能需要在我可能在 Orchard 做的另一个项目中采用这种方法。
【解决方案2】:

我正在修改CompositionStrategy,发现你必须修改以下内容

1. SetupService.cs (Modules\Orchard.Setup\Services):

在 Setup 方法中硬编码的表是 “Orchard_Framework_DataMigrationRecord”和 "Settings_ShellDescriptorRecord"

2。 InfosetController.cs(模块\升级\控制器):

这个类中有多个表被硬编码,需要更新。

3. DataMigrationManager.cs(数据\迁移):

将 SchemaBuilder 参数替换为构造函数。

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多