违反PRIMARY KEY约束’PK_dbo.AmazonProducts’。 无法在对象中插入重复键

我在尝试保存作为父对象的外键的实体时遇到问题。

我有一个amazonProduct实体。 还有一个AmazonCompetitivePrice实体,它是amazonProduct上的虚拟列表,如下所示:

public class AmazonProduct { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public virtual int ASIN public virtual IList amazonProductCompetitivePrices = new List(); } 

所以我有一个从数据库中检索的AmazonProduct,然后将新的AmazonProductCompetitivePrice添加到amazonProduct。

但是当我尝试保存时,我收到以下错误:

违反PRIMARY KEY约束’PK_dbo.AmazonProducts’。 无法在对象’dbo.AmazonProducts’中插入重复键。\ r \ n语句已终止

看起来它没有意识到我的AmazonProduct已经存在于数据库中,它试图保存一个新的,但主键已经存在!

我使用流畅的API来映射外键,如下所示:

  modelBuilder.Entity() .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; } } 

多数民众赞成…并感谢您的帮助!!

这一行:

 amazonProductCompetitivePrice.AmazonProduct = amazonProduct; 

隐式地 amazonProduct实例添加到上下文中。 因为该实例是使用不同的上下文实例检索的,所以当前实例认为它是新的AmazonProduct 。 你应该附上它,如下所示:

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

另一种方法:您只能为amazonProductCompetitivePrice而不是navigation属性设置外键属性。

我有这个问题首先我删除了

[DatabaseGenerated(DatabaseGeneratedOption.None)]

来自我的实体类的注释。 然后,我手动从我的sql server中删除了表,并在NuGet包管理器控制台中再次使用了update-database -Verbose 。 现在,它的作品!