实体框架在同一事务期间插入,更新,删除

时间:2011-06-24 01:27:05

标签: entity-framework insert

我遇到了问题,我有一个可以更新数据和插入数据的向导。因此,如果我有一个现有的团队成员列表,我可以更新他们的角色但是如果有必要,我还可以添加/插入一个人到这个团队。因此,我可以在同一个事务中更新角色并将新的团队成员插入到同一个表中。数据可以更新并插入表团队成员。

当我尝试添加一个新的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 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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()