13

エンティティ フレームワーク (ベータ) 用の Oracle プロバイダーを使用していますが、問題に直面しています。

テーブルには Id 列があり、StoreGeneratedPattern で Identity に設定されています。EF は、シーケンスの作成などの「基礎となる作業」を自動的に行い、テーブルに追加するレコードごとに新しい ID を取得すると考えました。しかし、コードを実行して新しいレコードを追加すると、次のようになります。

var comment = new Comment
{
    ComplaintId = _currentComplaintId,
    Content = CommentContent.Text,
    CreatedBy = CurrentUser.UserID,
    CreatedDate = DateTime.Now
};

context.Comments.AddObject(comment);
context.SaveChanges();

例外がまだスローされます。

{"ORA-00001: 一意の制約 (ADMINMGR.CONSTRAINT_COMMENT) に違反しています"}

(CONSTRAINT_COMMENT は、コメント ID が一意でなければならないという制約です。

これを解決するにはどうすればよいですか?

どうもありがとうございました!

4

5 に答える 5

17

StoreGeneratedPattern="Identity" は、値が挿入時に DB 側で生成されること、および挿入ステートメントで値を指定してはならないことを単に EF に伝えます。

Oracle でシーケンスを作成する必要があります。

create sequence ComplaintIdSequence minvalue 1 maxvalue 9999999 start with 1 increment by 1;

そして、テーブルの挿入を行うトリガーはそれを使用します:

create or replace trigger CommplaintIdTrigger  
before insert on comment for each row 
begin 
  if :new.ComplaintId is null then select ComplaintIdSequence.nextval into :new.ComplaintId from dual; 
  endif; 
end;
于 2011-03-08T03:52:45.983 に答える
0

別のオプションは次のとおりです。

Alextansc が説明した方法でシーケンスを作成します。MySequence.nextval を主キーとして使用するストアド プロシージャを作成します。

このモデルの「挿入」をストアド プロシージャにマップすると、機能します。

データベースファーストのアプローチを使用してこれをテストしました。

ストアド プロシージャへのデータベース ファースト マッピングの使用は非常に簡単です。edmx ファイルに移動し、ストアド プロシージャにマップするモデルを右クリックします。「ストアド プロシージャ マッピング」をクリックします。ページの下部にあるダイアログには、挿入、更新、および削除をストアド プロシージャにマッピングするための 3 つのドロップダウン メニューが表示されます。

于 2014-02-20T17:55:12.813 に答える
0

Oracle ODP.NET、マネージド ドライバー、および Entity Framework 6 を使用しています。コード ファースト アプローチを使用してテーブルを作成しましたが、主キーが null のため、レコードを追加できませんでした。

解決策は、ユーザーに
「CREATE SEQUENCE」
「CREATE TRIGGER」の両方の
権限を付与し、スキーマを再作成することでした。

パッケージ管理コンソールで -verbose フラグを使用した後、これに気付きました

于 2015-10-22T02:33:29.460 に答える
0

この SQL をすべて覚える代わりに、次のようにMig#を使用して簡単に行うことができます。

        var schema = new DbSchema(ConnectionString, DbPlatform.Oracle12c);
        schema.Alter(db => db.CreateTable("TableName")
            .WithPrimaryKeyColumn("Id", DbType.Int32).AsIdentity()
            ...);

この例では、IdMig# によって自動的に生成された必要なトリガーとシーケンスが列に含まれます。

于 2015-12-23T15:13:54.177 に答える