2013-04-26 85 views
3

重複鍵我有一個問題,試圖挽救這是一個外鍵的父對象的實體..違反PRIMARY KEY約束'PK_dbo.AmazonProducts'。不能插入對象

我有一個amazonProduct實體。而這是對amazonProduct像這樣一個虛擬的列表中AmazonCompetitivePrice實體:

public class AmazonProduct 
{ 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public virtual int ASIN 

     public virtual IList<AmazonProductCompetitivePrice> amazonProductCompetitivePrices = new List<AmazonProductCompetitivePrice>(); 
} 

所以我有一個AmazonProduct這是我從數據庫中檢索,然後添加一個新的AmazonProductCompetitivePrice到amazonProduct。

但是當我試圖挽救這個,我得到以下錯誤:

Violation of PRIMARY KEY constraint 'PK_dbo.AmazonProducts'. Cannot insert duplicate key in object 'dbo.AmazonProducts'.\r\nThe statement has been terminated

它看起來像它沒有意識到,我的AmazonProduct是已經在數據庫中,它試圖挽救一個新的,但主鍵已經存在!

我用流利的API映射外鍵,像這樣:

 modelBuilder.Entity<AmazonProduct>() 
        .HasMany(pl => pl.AmazonProductCompetitivePrices) 
        .WithOptional(p => p.AmazonProduct) 
        .Map(c => c.MapKey("ASIN")); 

任何人都知道什麼是問題呢?

在此先感謝!

編輯: 對象檢索:

using (var uow = new UnitOfWorkInventory()) 
      { 
       using (var amazRepo = new AmazonProductRepository(uow)) 
       { 
        return amazRepo.FindByAsin(ASIN); 
       } 
      } 
public AmazonProduct FindByAsin(string asin) 
     { 
      return context.AmazonProducts.Include(x => x.AmazonLowestOfferListings).Include(x => x.AmazonMyPrices).Include(x => x.AmazonProductCompetitivePrices).SingleOrDefault(x => x.ASIN == asin); 
     } 

這讓我的AmazonProduct ..然後保存:

using (var uow = new UnitOfWorkInventory()) 
{ 
    using (var amazonRepo = new AmazonProductCompetitivePriceRepository(uow)) 
    { 
      amazonProductCompetitivePrice.AmazonProduct = amazonProduct; 
      amazonRepo.InsertOrUpdate(amazonProductCompetitivePrice); 
    } 
      uow.Commit(); 
} 

    public void InsertOrUpdate(AmazonProductCompetitivePrice amazonProductCompetitivePrice) 
    { 
     if (amazonProductCompetitivePrice.Id == default(int)) 
     { 
      // New entity 
      context.AmazonProductCompetitivePrices.Add(amazonProductCompetitivePrice); 
     } 
     else 
     { 
      // Existing entity 
      context.Entry(amazonProductCompetitivePrice).State = EntityState.Modified; 
     } 
    } 

那一切..並感謝您的幫助!

+0

如何保存實體? – ysrb 2013-04-26 13:27:58

+0

聽起來像你知道確切的問題 - 你不能保存它的項目已經存在,你必須修改現有的項目。爲了修改一個項目,你需要「自定義」代碼,或者你必須讀入原始實體並在框架保存之前修改它。 – Hogan 2013-04-26 13:29:13

+0

請顯示完整的代碼示例:檢索,更新和更改保存。 – Dennis 2013-04-26 13:31:33

回答

5

這條線:

amazonProductCompetitivePrice.AmazonProduct = amazonProduct; 

增加amazonProduct實例上下文暗示。由於該實例是通過不同的上下文實例進行檢索的,因此當前實例認爲它是新的AmazonProduct。你應該重視它,而不是,是這樣的:

if (amazonProductCompetitivePrice.AmazonProduct != null && amazonProductCompetitivePrice.AmazonProduct.Id != 0) 
{ 
    context.Entry(amazonProductCompetitivePrice.AmazonProduct).State = EntityState.Unchanged; 
} 

另一種方式:您只能爲amazonProductCompetitivePrice,而不是導航屬性設置外鍵屬性。

+0

amazonProduct存在數據庫中。我只是想添加一個amazonProductCompeteitivePrice與外鍵到我從數據庫中檢索到的amazonProduct。如果這有道理? :/ – 2013-04-26 13:42:47

+1

> amazonProduct已存在於數據庫中 - 是的,但用於保存更改的** context **實例認爲'amazonProduct'就像** new **項目。 – Dennis 2013-04-26 13:49:13

+0

啊..好吧,我不知道這個!非常感謝! – 2013-04-26 13:57:08

0

我有這個問題 首先我刪除

[DatabaseGenerated(DatabaseGeneratedOption.None)]從我的實體類

註解。 然後,我從我的sql服務器手動刪除表,並再次使用 update-database -VerboseNuGet程序包管理器控制檯。 現在,它的工作!

相關問題