Webアプリケーションで主キー制約違反が非常に断続的に発生しています。私は、コードベースを検索した、と次のようにしても、このテーブル内の任意の行を作成する唯一のコードは次のとおりです。EFでテーブルに新しい行を追加すると、主キーの制約違反が発生する
decimal nextDocId = (from d in context.TPM_PROJECTVERSIONDOCS
orderby d.DOCUMENTID descending
select d.DOCUMENTID).Max() + 1;
foreach (TPM_PROJECTVERSIONDOCS doc in documents)
{
TPM_PROJECTVERSIONDOCS newDoc = new TPM_PROJECTVERSIONDOCS();
newDoc.DOCUMENTID = nextDocId;
newDoc.DOCBLOB = doc.DOCBLOB;
newDoc.DOCUMENTNAME = doc.DOCUMENTNAME;
newDoc.FILECONTENTTYPE = doc.FILECONTENTTYPE;
version.TPM_PROJECTVERSIONDOCS.Add(newDoc);
nextDocId++;
}
我々が得るエラーは次のとおりです。これはDOCUMENTID
がすでにあることを意味
ORA-00001: unique constraint (TPMDBO.TPM_PROJECTVERSIONDOCS_PK) violated
使用中で。私はこれを引き起こす原因についていくつかの理論を持っています。まず、nextDocId
が設定された時刻からコンテキストが保存された時刻までの間に、複数の人が同時に文書を追加していた場合、新しい文書がデータベースに追加されている可能性があります。しかし、この時間は数ミリ秒に過ぎないので、私たちのサイトには少量のトラフィックしかないとは思えません。
私の2番目の理論はおそらくEFがある種のキャッシングを行い、nextDocId
はもはや有効ではないキャッシングされた値を返している可能性があります。
このエラーはたびに頻繁に発生するため、もちろんプロダクションサーバーでのみ発生するため、デバッグや再プロビジョニングの方法がありません。
私の質問:この可能性が最も高い原因は何ですか?プライマリキー違反を防ぐためにこのコードを書き直す方が良いでしょうか?プライマリ・キーに自動インクリメント・フィールドを使用したいのですが、残念ながらOracleはそれらをサポートしていません。 UUIDに切り替えることも解決策になりますが、多くのDB変更が発生します。ありがとう!
UPDATE:
<EntityType Name="TPM_PROJECTVERSIONDOCS">
<Key>
<PropertyRef Name="DOCUMENTID" />
</Key>
<Property Name="DOCUMENTID" Type="decimal" Nullable="false" />
<Property Name="PROJECTID" Type="decimal" Nullable="false" />
<Property Name="VERSIONID" Type="decimal" Nullable="false" />
<Property Name="DOCUMENTNAME" Type="VARCHAR2" Nullable="false" MaxLength="500" />
<Property Name="DOCBLOB" Type="BLOB" Nullable="false" />
<Property Name="FILECONTENTTYPE" Type="VARCHAR2" Nullable="false" MaxLength="80" />
</EntityType>
シーケンスにDOCUMENTID
デフォルトを作成するか、またはEFを使用してシーケンスを照会するために、私はどのような方法を知らないんだ:
はここTPM_PROJECTVERSIONDOCS
エンティティです。
ポットエンティティに参加してください –
@ Floradu88 - 完了。 –