2013-05-03 45 views
0

我在sql server 2008中創建關係爲1 - *的表。錯誤添加表中的對象包含FK

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

您是否嘗試過將'position.ID'設置爲唯一值? – paul 2013-05-03 11:28:47

+0

你想在這裏做什麼?更新? – 2013-05-03 11:31:32

回答

0

爲了解決此錯誤,您需要確保您添加的ID是唯一的。

0

你所做的就是你創建了一個新的Tour,並帶有一個已經存在的ID。

如果你想要的位置連接到具有ID = 17,你必須讓你從數據庫中要記錄旅遊:

更換position.Tour = tour;
position.Tour = db.Tour.FirstOrDefault(p=>p.ID==17);

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

當你把它調整到您的需求,您可以將對象傳遞給方法然後保存更改。

+0

你能解釋一下 – 2013-05-03 15:45:30

+0

那麼,你需要解釋哪些部分?我會用(.Find)解決方案,你遇到的問題是你正在做一個新的項目,而你應該找到現有的項目,然後編輯一個。 – 2013-05-06 19:42:28

相關問題