1

現在、MVC3アプリケーション内でEntity Frameworkを使用して、Oracleデータベースに接続しています。Oracleデータベースのテーブルに、主キーを定義するシーケンスを含む新しいレコードを書き込みたい。もちろん、主キーはnullではないように定義されています。私の意見はすべて、RazorではなくASP.Netで記述されています。

そこにあるほとんどの投稿では、StoreGeneratedPatternをedmxモデルに直接設定することを推奨しているようです。ただし、次のようなほとんどのedmxモデルの例に気付きます。VSエンティティフレームワークのOracleエンティティは、コードの主キーを更新しません。EntityTypes を使用して定義されたテーブルが含まれます。これを実行したいテーブルは、実際にはEntitySetに含まれています。

<EntitySet Name="REGISTERED_PERSON" EntityType="Model.Store.REGISTERED_PERSON" store:Type="Tables" Schema="MYSCHEMA" />

これにStoreGeneratedPattern=Identityを設定しようとすると、StoreGeneratedPattern属性が許可されていないというエラーが表示されます。これは、おそらくEntityTypeではないためです。私はもともと最大値を取得することを考えていました。LINQステートメントを介してデータベースからregistered_person_idを取得し、それをモデルに割り当てますが、2つの挿入を同時に実行すると、IDが重複するという問題が発生します。

データベースもチェックしましたが、トリガーは書き込まれていません。Oracleでは、以下に示すように、シーケンスによって生成される次の値を取得するために、dualから選択することを選択できることを知ってい
ます。selectMY_SEQ.nextval、'some value' from dual

この投稿はここにあります:シーケンスに関するpostgresql nextvalの質問には素晴らしいタイトルがありますが、それに関する問題は、私がpostgresqlまたはPHPを使用していないことです。したがって、残念ながらそれは役に立ちません。また、レコードの挿入時にシーケンスを起動するためのトリガーは作成されていません。

シーケンスから次の値を取得し、それをRegistered_Person_Idに割り当てるにはどうすればよいですか?できれば、モデルオブジェクト全体がコントローラーに戻されてデータベースに挿入される前に、ビューで割り当てますか?

4

1 に答える 1

3

Oracleでこれを機能させるには、トリガーとシーケンスの両方が必要であることがわかりました。これが私が本番環境で使用するトリガーパターンです:

CREATE OR REPLACE TRIGGER MYSCHEMA.TRIGGER_NAME 
BEFORE INSERT ON MYSCHEMA.REGISTERED_PERSON
FOR EACH ROW
WHEN ( NEW.REGISTERED_PERSON_ID IS NULL )
BEGIN
  SELECT MY_SEQUENCE.NEXTVAL INTO :NEW.REGISTERED_PERSON_ID FROM dual;
END;
于 2012-10-26T02:52:43.143 に答える