5

我对 CF9 ORM 映射有疑问。

我不时收到以下错误(是的,它大部分时间都可以正常工作),

Mapping for component model.Pubs not found. Either the mapping for this component is missing or the application must be restarted to generate the mapping.

Application.cfc 中的 ORM 定义

    <cfscript>
    this.datasource = "Pubs";
    this.ormenabled = true;
    this.ormsettings= {
                        dialect="MicrosoftSQLServer",
                        dbcreate="update",                              
                        eventhandling="true"
                    };      
</cfscript>

<cfset this.mappings["/model"] = getDirectoryFromPath(getCurrentTemplatePath()) & "model" />

修复它的唯一方法是刷新 ORM 几次,即在 Application.cfc 上点击 ?init=true。它仍然是一个临时解决方案,但我需要知道它的根本原因并修复它。

<cfscript>          
if(structKeyExists(url, "init")) { ormReload(); applicationStop(); location('index.cfm?reloaded=true'); }

请指教。

谢谢!

4

2 回答 2

1

好的,感谢@Henry 和@Walter 的评论。他们引领着正确的解决方案。

这是我所做的以确保它始终保持稳定。

  1. 我为所有 ORM CFC 使用了一个文件夹(位置)。每个部分曾经有一个“模型”文件夹。部分是一个根目录下的同级文件夹并共享相同的 Application.cfc。我将其更改为所有 CFC 的一个根级文件夹,即:/root/ormmodel
  2. 在/root/Application.cfc上,我调整了以下代码

    <cfset application.mappings["/ormmodel"] = expandPath("/root/ormmodel") />
    

    this.ormsettings= {
        cfclocation = ["ormmodel"],
        autogenmap = true,
        ...
        eventhandling="true"                            
    };  
    

    请注意 cflocation 值中缺少的“/”。

  3. 在调用模型组件时,我将代码从 pub = new ormmodel.Pubs() 更改为

    pub = EntityNew("Pubs");
    
  4. 在不相关的一点上,我将组件名称更改为驼峰命名法,并避免使用下划线和破折号等特殊字符。

我希望这会有所帮助,并为其他人节省数小时的挫败感和悬念。

快乐编码!

于 2012-12-10T15:52:24.163 回答
1

我也有你的问题,但现在它工作正常。首先,如果你不设置ormsettings.cfclocation,ColdFusion 会这样做:

如果未设置,ColdFusion 将查看应用程序目录、其子目录及其映射目录以搜索持久 CFC。(见规格

这很容易出错,因为您永远不知道 ColdFusion 在所有目录中找到了什么。

当您将 cfclocation 添加到您的示例时,它应该可以工作:

this.ormsettings= {
    cfclocation = ["/model", "/other/entities", "/more/other/entites"]
}

那里有很多讨论,关于如何指定 cfclocation 的路径。对我来说,这种方式有效。

但是我的 cfclocation 的第一个元素始终是应用程序映射,例如您的this.mappings["/model"]. 我没有在 webroot 中使用 webserver 别名或 CFC 测试它,没有映射。您还应该避免冲突命名空间,例如 webroot 中的“model”目录,同时具有“/model”映射。

祝你好运:)

于 2012-11-29T19:55:24.060 回答