2011-06-24 52 views
2

我有一個問題,我有一個嚮導,可以更新數據和插入數據。所以,如果我有一個現有的團隊成員名單,我可以更新他們的角色,但如果有必要,我還可以向此團隊添加/插入一個人。所以我可以在同一個事務中更新角色並在同一個表中插入新的團隊成員。數據可以更新並插入到表格teamMembers中。實體框架插入,更新,刪除在同一交易

當我嘗試添加新的teamMember時,我也有一個現有成員,我只是想更新他的角色。 這兩個更改都發生在名爲TeamMember的同一個表中。當我調試上下文時,一切看起來都不錯。它顯示TeamMember表會發生兩處更改。一個事務是更新,另一個事務是插入。當我執行更新時使用:

var teamMember = new TeamMember 
{ 
    Name = user.FullName, 
    UserProfileId = user.UserProfileId, 
    RoleId = user.RoleId 
}; 

TeamMemberList.Add(teamMember); 
project.TeamMembers = TeamMemberList; 

//And then call 
this.Context.Projects.Attach(project); 
this.Context.Entry(project).State = System.Data.EntityState.Modified;

它更新但需要插入的記錄失敗。

如何在同一事務中對同一表進行插入和更新?

電流產生的誤差:

到數據庫的更改已成功提交,但在更新對象上下文時發生錯誤。 ObjectContext可能處於不一致的狀態。內部異常消息:發生參照完整性約束衝突:定義參照約束的屬性值在關係中的主體和從屬對象之間不一致。

回答

2

我認爲您需要將TeamMember實體添加到上下文的全局列表中。例如:

var teamMember = new TeamMember() 
{ 
    Name = user.FullName, 
    UserProfileId = user.UserProfileId, 
    RoleId = user.RoleId 
} 

project.TeamMembers.Add(teamMember); 
this.Context.TeamMembers.Add(teamMember); 

this.Context.SaveChanges(); 
+0

感謝它的工作。是否有任何信息解釋了爲什麼需要填充本地和全球範圍? – Keith

+0

當地您是指您的項目實體上的TeamMembers集合?如果是這樣,這實際上是將TeamMember鏈接到項目實體。如果它暴露在TeamMember實體上,也可以通過「Project」屬性完成。 –

0

如何加載現有項目實體,然後添加成員。

var project = this.Context.Project.Where(p => p.ID = "bar").Include("TeamMembers").FirstOrDefault(); 

var teamMember= new TeamMember 
{ 
    Name = user.FullName, 
    UserProfileId = user.UserProfileId, 
    RoleId = user.RoleId 
}; 

project.TeamMembers.Add(teamMember); 

this.Context.SaveChanges()