在包含FK的表中添加对象时出错
本文关键字:添加 对象 出错 包含 FK | 更新日期: 2023-09-27 18:11:53
我在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无法跟踪具有相同密钥的多个对象
如何解决此错误?
为了解决此错误,您需要确保添加的id是唯一的。
您所做的是使用已经存在的ID创建了一个新的Tour
。
如果你想把这个位置附加到ID=17的巡回赛上,你必须从数据库中获得你想要的记录:
更换position.Tour = tour;
使用position.Tour = db.Tour.FirstOrDefault(p=>p.ID==17);
您可以通过首先分离它来解决这个问题,您可以通过设置新值来更新对象。像这样:
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;
}
}
当您根据需要对其进行调整时,可以将对象传递给方法,然后保存更改。