2011-06-24 7 views
2

問題があります。データを更新してデータを挿入できるウィザードがあります。だから、もし私がチームメンバーの既存のリストを持っていれば、彼らの役割を更新することができますが、必要ならばこのチームに人を追加/挿入することもできます。したがって、同じトランザクション中に、ロールを更新して、新しいチームメンバーを同じテーブルに挿入することができます。データを更新してテーブルteamMembersに挿入することができます。エンティティフレームワーク同じトランザクション中に挿入、更新、削除する

私は新しいteamMemberを追加しようとすると、自分の役割を更新したいだけの既存のメンバーも持っています。 どちらの変更も、TeamMemberという同じテーブルに発生します。コンテキストをデバッグすると、すべてがうまく見えます。 TeamMemberテーブルに2つの変更があることが示されています。 1つのトランザクションは更新であり、他のトランザクションは挿入である。

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;

更新が実行されますが、挿入する必要があるレコードは失敗します。

同じトランザクション中に同じテーブルに挿入して更新することはできますか?データベースへ

変更が正常にコミットされたが、オブジェクトコンテキストを更新中にエラーが発生しました:

CURRENTエラーです。 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() 
関連する問題