附加实体时出错

时间:2017-06-16 08:53:09

标签: c# asp.net-mvc entity-framework

当我从Entity框架中的模型集合中尝试项目时,我收到此错误。我收到以下错误:

  

附加类型''的实体失败,因为另一个实体   相同类型已具有相同的主键值。这可能发生在   使用'附加'方法或将实体的状态设置为   '不变'或者'修改'如果图中有任何实体   冲突的关键值。这可能是因为一些实体是新的和   尚未收到数据库生成的键值。在这种情况下使用   '添加'方法或“添加”#39;实体状态跟踪图形和   然后将非新实体的状态设置为“未更改”#39;或者'修改'如   适当

请有人帮帮忙 这是我的代码:

 public class Attendees 
 {
    [Key]
    public int AttendeesId { get; set; }
    public ICollection<Programme> programmes { get; set; }
    public ICollection<Presentations> presentations { get; set; }
    public ICollection<Abstracts> abstracts { get; set; }
    [Required]
    public bool IsKeynoteSpeaker { get; set; }



  }
public class Programme
{
    [Key]
    public int ProgrammeId { get; set; }
    [Required, MaxLength(256,
        ErrorMessage = "The length of the field is more than expected")]
    public string Title { get; set; }
    public ICollection<Attendees> presenters { get; set; }
    public ICollection<Attendees> chairpersons { get; set; }
    public ProgrammeType programmeType { get; set; }
    public ConferenceDay Daynumber { get; set; }


}

public void RemovePresenterFromProgramme(Programme programme,Attendees        attendees)
    {
        var context = _programmeRepository.GetGenericRepository.GetDbContext as ConferenceDbContext;

        context.Entry(programme).State = System.Data.Entity.EntityState.Modified; // get the error here
        var attendee = programme.presenters
            .Where(c => c.AttendeesId == attendees.AttendeesId).SingleOrDefault();

        programme.presenters.Remove(attendee);
        context.SaveChanges();
    }

2 个答案:

答案 0 :(得分:0)

你可以尝试这样的事吗?

context.Programmes.Attach(programme);
 var entry = context.Entry(programme);
 entry.State = EntityState.Modified;
 var attendee = programme.presenters
            .Where(c => c.AttendeesId == attendees.AttendeesId).SingleOrDefault();

        programme.presenters.Remove(attendee);
 context.SaveChanges();

答案 1 :(得分:0)

感谢Junnas的帮助,但我发现了这一点。抛出错误是因为Program对象具有已在上下文中存在的导航属性。这导致它无法附加,所以这就是我所做的修复它。

var context = _programmeRepository.GetGenericRepository.GetDbContext as ConferenceDbContext;
context.Entry(attendees).State = System.Data.Entity.EntityState.Detached;
context.ProgrammeObjects.Attach(programme);
var attendee = programme.presenters
            .Where(c => c.AttendeesId ==    attendees.AttendeesId).SingleOrDefault();
programme.presenters.Remove(attendee);

context.Entry(programme).State = System.Data.Entity.EntityState.Modified;

context.SaveChanges();

Program对象已经有一个在上下文中存在的与会者对象。所以不得不告诉entityframework通过分离并为我工作来停止跟踪所述与会者对象。谢谢你的帮助。