2013-01-22 62 views
0

我有errr有一個可操作的wpf應用程序來操縱數據庫信息(首先使用Entity Framework,數據庫)。在Entity Framework中創建新實體時違反唯一約束條件

數據的結構的金融信息4個表(所有1:1映射到5的主表),與一對夫婦查找表的與主表的外鍵參考文獻SQLServer中:(1映射到主表中的另一1),然後「從數據庫更新模型......」跑到嚮導將新表添加到模型

我添加了一個表。 .edmx文件中的所有內容都可以正常使用,包括'0..1'關係鏈接。

然而,當我試圖挽救,我收到一個錯誤「唯一約束違反」。

我的創作代碼:

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.它看起來像是兩次添加相同的記錄,但我無法弄清楚。

編輯: 下面評論建議,我改變了 'AddNewStatementsQuery',所以看起來像行:

lGFinanceEntities.StatementsMains.Context.AddObject("StatementsMains", newStatement); 

改爲:

lGFinanceEntities.StatementsMains.AddObject(newStatement); 

,然後到:

lGFinanceEntities.AddObject("StatementsMains", newStatement); 

此DI d沒有解決密鑰違規錯誤。

如何找出/如何將數據(if語句比lGFinanceEntities.SaveChanges()即等)被保存兩次?

+0

有沒有理由通過'Context'屬性添加項目?您可以直接將它們添加到'DbContext'('lGFinanceEntities')或表本身('StatementMains'等)。 –

+0

可能是因爲這是我遵循的網站/教程的做法。將考慮通過您建議的不同方法添加 – mcalex

+0

@TiesonT。嗨,沒有增加上下文或表格似乎沒有任何影響的結果。仍然唯一的密鑰違規 – mcalex

回答

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(); 

但是,這告訴我有很多關於你的數據模式,在這裏不是很明顯。例如,StatementsMain對象中的參考值161是什麼?如果將主對象分配給作爲外鍵的對象,則可以讓EF在保留其他對象時執行將新ID分配給其他對象的工作。