2011-03-08 5 views
11

私はEntityフレームワーク(ベータ版)用にOracleプロバイダーを使用していますが、問題が発生しています。Entityフレームワークを介してOracleデータベースのIDを自動的に生成する方法は?

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

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は制約がコメントアイデンティティ は一意でなければならないことが必要である。

どうすればこの問題を解決できますか?

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

+0

http://stackoverflow.com/questions/8232997/generate-identity-for-an-oracle-database-through-entity-framework-using-an-exisi/19684494#19684494 –

答えて

15

StoreGeneratedPattern = "Identity"は、値が挿入時にDB側で生成され、挿入文で値を提供しないことをEFに伝えるだけです。

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;
+1

あなたの答えをありがとう、しかし、私はまだOracleが自動的にこれをしなかったと信じることができません:( – Vimvq1987

+0

オラクルは絶対に*してはいけません*自動的にはしません* –

+2

私はOracleがデータベースでそれを行うべきだとは言いませんでしたが、それはそのプロバイダで間違いなくそうしなければなりません( "あなたのコメントに「フレームワーク」があります) – Vimvq1987

0

別のオプションは、次のようになります。

シーケンスを作成するには、まだOracleのシーケンスを作成する必要が

Alextanscの記述方法。 MySequence.nextvalを主キーとして使用するストアドプロシージャを作成します。

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

これは、データベースの最初の方法を使用してこれをテストしました。

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

0

Oracle ODP.NET、マネージド・ドライバおよびEntity Framework 6を​​使用しています。コード優先アプローチを使用して表を作成しましたが、NULL主キーのためにレコードを追加できませんでした。 'CREATE TRIGGERを'
権限を
とを '配列を作成'
とスキーマを再作成:

ソリューションは、私のユーザーの両方を付与することでした。

私は、パッケージ管理コンソールで

0

の代わりに、このSQLのすべてを覚えているの-verboseフラグを使用した後、あなたは簡単にこのようMig#を使用して行うことができ、これを実現:

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

この例では、 Idカラムには、Mig#によって自動的に生成される必要なトリガとシーケンスがあります。

+0

誰でもこれを行いましたか? – Worthy7

0

のOracle 12cは、それを解決した

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int SomeNumber { get; set; } 
関連する問題