2016-10-11 13 views
0

私は外部データベース(MySQLに接続したばかりの他のプロジェクトのデータベース)にMySQLを使用しています。だから私はデータベースの構造を変更することはできません。Entity Framework with mysql、PKなしのエンティティ

データベースにはPKなしのテーブルがいくつかありますが、正しい場合はEFエンティティにプライマリキーが必要です。

私はテーブルを読んでいるだけで問題はないと思っています。しかし、OKに同じ値を持つテーブルに行を追加する必要がある場合はどうすればよいでしょうか?同じ値のPKが既に存在するというエラーが発生します...

私はそのタブーを扱う方法を教えてください。事前に感謝

+0

JFYIあなたのプロフィールはあなたが[upvote](http://stackoverflow.com/help/privileges/vote-up)へのあなたの特権をまだ使用していないことを示しています。あなたは便利な答えと質問をupvoteすることができます。また、[承諾する](http://meta.stackexchange.com/a/5235/308647)回答を受け入れると、受け入れられた回答をアップヴォートするのが合理的です。 –

答えて

0

すべてのテーブルは、主キーを持っている必要があります。スキーマを変更できるかどうかわかりませんが、解決策として、これらのテーブルに自動インクリメンタルプライマリキーを追加し、その新しい列をEntity Frameworkキーとして使用する方法があります。

このように、同じ値を持つ行を挿入すると同時に、一意の行識別子を持つことができます。すべての列を主キー制約に追加するのは醜い回避策です。

+0

はい、私はそれを知っていますが、私はデータベーススキーマを変更することはできません:( –

+0

エンティティフレームワークエンティティはすべてのエンティティが必要なのでSQLを記述する必要がありますか、エンティティを操作する場合は、 SQLを記述するには、Entity Frameworkメソッドhttps://msdn.microsoft.com/en-us/data/jj592907.aspxを使用できます。明らかに、Entity Frameworkの機能を失うことはありますが、クエリ結果。 – jorgonor

0

あなたはPKの一部として、すべての列をマークしません追跡モードで実体を読むことができます:

var data = db.TheTable.Where(...).AsNoTracking().ToList(); 

あなたが同じ値を持つ新しい行を追加する必要がある場合 - あなたはすでにあなたの中に同じ行を持っていない限り、これはOKですデータベースコンテキスト。 No Trackingモードでは、と同じ値を持つ2つのローを追加した場合にのみ、これが発生します。

回避策:SaveChangesメソッドの後にエンティティを切り離し、別々の操作で行を追加します。

var row = ...; 
db.TheTable.Add(row); 
db.SaveChanges(); 
db.Entry(row).State = EntityState.Detached; 
// now you can add the row again 

をあなたは人跡未踏の行を削除する必要がある場合 - あなたはそれを最初に添付する必要があります。

var row = ...; 
db.TheTable.Attach(row); 
db.TheTable.Remove(row); 
db.SaveChanges(); 
db.Entry(row).State = EntityState.Detached; 

それともできる手動変更行の状態:

var row = ...; 
db.Entry(row).State = EntityState.Deleted; 
db.SaveChanges(); 
db.Entry(row).State = EntityState.Detached; 

しかし、私はたくさんの行が削除されますわからない重複して行を削除しようとすると。

関連する問題