0

私は、データベース情報を操作する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 ステートメント以外) を調べるにはどうすればよいですか?

4

1 に答える 1

0

うーん。あなたのコードを見ると、次のように単純化されていることがわかります。

// Create the new objects    
var statement = new StatementsMain()
{
    this.LocalGovt.StakeholderID, 161, this.Year.FinancialYearID
};

var income = new StatementsIncome()
{
    StatementsMain = statement
};

var note = new StatementsNote()
{
    StatementsMain = statement
};

var rss = new StatementsRSSFinPos()
{
    StatementsMain = statement
};

var surplus = new StatementsSurplusDeficit()
{
    StatementsMain = statement
};


// Add the objects into the context 
lGFinancialEntities.AddObject(statement);
lGFinancialEntities.AddObject(income);
lGFinancialEntities.AddObject(note);
lGFinancialEntities.AddObject(rss);
lGFinancialEntities.AddObject(surplus);

// Persist the objects to the data storage
lGFinancialEntities.SaveChanges();

または、さらに良い:

// Create the main object
var statement = new StatementsMain()
{
    this.LocalGovt.StakeholderID, 161, this.Year.FinancialYearID
};

// Add the objects into the context
lGFinancialEntities.AddObject(statement);
lGFinancialEntities.AddObject(new StatementsIncome() { StatementsMain = statement });
lGFinancialEntities.AddObject(new StatementsNote() { StatementsMain = statement });
lGFinancialEntities.AddObject(new StatementsRSSFinPos() { StatementsMain = statement });
lGFinancialEntities.AddObject(new StatementsSurplusDeficit() { StatementsMain = statement });

// Persist the objects to the data storage
lGFinancialEntities.SaveChanges();

しかし、これは、ここでは明らかでないデータ スキーマがたくさんあることを示しています。たとえば、値はオブジェクト内で何を161参照していStatementsMainますか?

参考までに、プライマリ オブジェクトを外部キーであるオブジェクトに割り当てると、EF は、永続化されている他のオブジェクトに新しい ID を割り当てる作業を行うことができます。

于 2013-01-22T22:55:56.870 に答える