5

CF9ORMマッピングに問題があります。

私は時々次のエラーを受け取ります(はい、ほとんどの場合正常に動作します)、

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

私もあなたの問題を抱えていましたが、今はうまくいきます。まず、設定しない場合ormsettings.cfclocation、ColdFusionは次のことを行います。

設定されていない場合、ColdFusionはアプリケーションディレクトリ、そのサブディレクトリ、およびマップされたディレクトリを調べて、永続的なCFCを検索します。(仕様を参照)

このすべてのディレクトリでColdFusionが何を検出するかがわからないため、これはエラーが発生しやすくなります。

例にcfclocationを追加すると、次のように機能するはずです。

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

cfclocationのパスを指定する方法については、多くの議論があります。私にとっては、そのように機能します。

しかし、私のcfclocationの最初の要素は、常にあなたのようなアプリケーションマッピングthis.mappings["/model"]です。マッピングせずに、WebルートのWebサーバーエイリアスまたはCFCでテストしていません。また、「/ model」マッピングを使用している間は、Webルートの「model」ディレクトリなどの名前空間の衝突を回避する必要があります。

幸運を:)

于 2012-11-29T19:55:24.060 に答える
1

さて、コメントをありがとう@Henryと@Walterの両方に感謝します。彼らは正しい解決策へのリードでした。

これが私がそれが常に安定していることを確認するためにしたことです。

  1. すべてのORMCFCに1つのフォルダー(場所)を使用しました。以前は、セクションごとに「モデル」フォルダーがありました。セクションは1つのルートの下にある兄弟フォルダーであり、同じApplication.cfcを共有します。これをすべてのCFCの1つのルートレベルフォルダーに変更しました。つまり、/ root / ormmodel
  2. /root/Application.cfcで、次のコードを調整しました

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

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

    cfclocation値に「/」がないことに注意してください。

  3. モデルコンポーネントを呼び出す際に、コードをpub = new ormmodel.Pubs()からに変更しました。

    pub = EntityNew("Pubs");
    
  4. 無関係な点として、コンポーネント名をキャメルケースの名前に変更し、アンダースコアやダッシュなどの特殊文字を避けました。

これがお役に立てば、他の誰かの欲求不満とサスペンスの時間を節約できることを願っています。

ハッピーコーディング!

于 2012-12-10T15:52:24.163 に答える