私は、データベース情報を操作するwpfアプリケーションが動作していました(Entity Frameworkを使用して、データベースを最初に)。
データの構造は、財務情報の 4 つのテーブル (すべて 5 つのメイン テーブルに 1:1 でマッピング) であり、メイン テーブルに外部キー ref を持つ 2 つのルックアップ テーブルがあります。
SqlServer にテーブル (メイン テーブルへの別の 1:1 マッピング) を追加し、[データベースからモデルを更新...] ウィザードを実行して、新しいテーブルをモデルに追加しました。「0..1」関係リンクを含め、.edmx ファイルではすべて問題ないように見えます。
ただし、保存しようとすると、「一意の制約違反」というエラーが表示されます。
私の作成コード:
private void AddNewStatementsQuery(LGFinanceEntities lGFinanceEntities)
{
StatementsMain newStatement = StatementsMain.CreateStatementsMain(9999, this.LocalGovt.StakeholderID, 161, this.Year.FinancialYearID);
StatementsIncome newInc = StatementsIncome.CreateStatementsIncome(newStatement.StatementsMainID);
StatementsNote newNote = StatementsNote.CreateStatementsNote(newStatement.StatementsMainID);
StatementsRSSFinPos newRSSFinPos = StatementsRSSFinPos.CreateStatementsRSSFinPos(newStatement.StatementsMainID);
StatementsSurplusDeficit newSurplusDeficit = StatementsSurplusDeficit.CreateStatementsSurplusDeficit(newStatement.StatementsMainID);
lGFinanceEntities.StatementsMains.Context.AddObject("StatementsMains", newStatement);
lGFinanceEntities.StatementsMains.Context.AddObject("StatementsIncomes", newInc);
lGFinanceEntities.StatementsMains.Context.AddObject("StatementsNotes", newNote);
lGFinanceEntities.StatementsMains.Context.AddObject("StatementsRSSFinPos", newRSSFinPos);
lGFinanceEntities.StatementsMains.Context.AddObject("StatementsSurplusDeficit", newSurplusDeficit);
if (lGFinanceEntities.SaveChanges() != 1) // this is causing the exception
{
MessageBox.Show("Error. New Statements not created", "Database Error");
}
}
新しいテーブルを追加する前は、上記のコードは機能していました。唯一の変更は、次の行の追加です。
StatementsSurplusDeficit newSurplusDeficit =
StatementsSurplusDeficit.CreateStatementsSurplusDeficit(newStatement.StatementsMainID);
...
lGFinanceEntities.StatementsMains.Context.AddObject("StatementsSurplusDeficit",
newSurplusDeficit);
興味深いことに、SqlServer をチェックすると 5 つのテーブルの新しいレコードがあるため、何かがどこかにレコードを作成しています。また興味深いことに、何かを試してメソッドを実行するたびに、主キーが 2 ずつインクリメントされています。同じレコードが 2 回追加されているように見えますが、方法がわかりません。
編集: コメントの提案に従って、「AddNewStatementsQuery」を次のような行に変更しました。
lGFinanceEntities.StatementsMains.Context.AddObject("StatementsMains", newStatement);
に変更されました:
lGFinanceEntities.StatementsMains.AddObject(newStatement);
そして、次のようにします。
lGFinanceEntities.AddObject("StatementsMains", newStatement);
これはキー違反エラーを解決しませんでした。
データが 2 回保存されている場所/方法 (つまり、lGFinanceEntities.SaveChanges()
if ステートメント以外) を調べるにはどうすればよいですか?