当我从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();
}
答案 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通过分离并为我工作来停止跟踪所述与会者对象。谢谢你的帮助。