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

时间:2013-05-03 11:24:17

标签: c# .net entity-framework-4

我在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无法使用相同的键

跟踪多个对象

如何解决此错误?

3 个答案:

答案 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;
    }
}

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