在包含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无法跟踪具有相同密钥的多个对象

如何解决此错误?

在包含FK的表中添加对象时出错

为了解决此错误,您需要确保添加的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;
    }
}

当您根据需要对其进行调整时,可以将对象传递给方法,然后保存更改。