我在sql server 2008中创建了两个关系为1 - *。
的表table 1: Tour (ID, date, ..) : ID : PK
table 2 : Position (ID,..) : ID : PK, and TourID : FK
Tour tour = new Tour() { ID = 17 /* this ID exist in table tou*/};
Position position = new Position();
position.Tour = tour;
position.Longitude = Longitude;
position.DateHeurePosition = DateH;
db.AttachTo("Tour", tour);
db.AddToPosition(position);
db.SaveChanges();
显示此错误:
ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键
跟踪多个对象
如何解决此错误?
答案 0 :(得分:0)
要解决此错误,您需要确保要添加的ID是唯一的。
答案 1 :(得分:0)
您所做的是您创建了一个新的Tour
,其ID已经存在。
如果您要将位置附加到ID = 17的巡回赛,您必须从数据库中获取所需的记录:
替换position.Tour = tour;
与position.Tour = db.Tour.FirstOrDefault(p=>p.ID==17);
答案 2 :(得分:0)
您可以通过首先分离它来解决此问题,您可以通过设置新值来更新对象。像这样:
ObjectContext API: context.YourEntitySet.ApplyCurrentValues(newEntity);
DbContext API: context.Entry(oldEntity).CurrentValues.SetValues(newEntity);
我认为你在这里唯一需要的是找到类似下面的附件
Tour t = Tours.Find(Id);//e.g. Id = 17 where Tours is the DbContext.Set<Tour>
position.Tour = t;
如果您有其他旅游列表:
Tour t = Tours.First(i=> i.Id == Id);//e.g. Id = 17 where Tours is something with interface IEnumarable<Tour>
position.Tour = t;
然后将值设置为该项目的其余部分。
但是如果你想看到更复杂的更新实现,这里是我对更新方法的实现:
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
var attachedEntity = DbSet.Find(entity.Id);
if (attachedEntity != null)
{
var attachedEntry = DbContext.Entry(attachedEntity);
entity.Created = attachedEntity.Created;
entity.LastModified = DateTime.Now;
attachedEntry.CurrentValues.SetValues(entity);
}
else
{
dbEntityEntry.State = EntityState.Modified;
entity.LastModified = DateTime.Now;
}
}
根据需要进行调整时,可以将对象传递给方法,然后保存更改。