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

本文关键字:对象 插入 dbo 约束 KEY PRIMARY PK AmazonProducts 违反 | 更新日期: 2023-09-27 18:10:57

我有一个问题,试图保存一个实体,这是一个父对象的外键..

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

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

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

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

违反了主键约束'PK_dbo.AmazonProducts'。不能在对象'dbo.AmazonProducts'中插入重复键。' r ' nThe声明已被终止

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

我使用fluent 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);
        }

让我得到亚马逊产品…然后save:

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

这一切. .谢谢你的帮助!!

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

这一行:

amazonProductCompetitivePrice.AmazonProduct = amazonProduct;

amazonProduct实例隐式添加到上下文。因为该实例是用上下文的不同实例检索的,所以当前实例认为它是新的AmazonProduct。你应该把它附加起来,像这样:

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

另一种方法:可以只设置amazonProductCompetitivePrice的外键属性,而不设置导航属性

我遇到了这个问题首先我删除了

[DatabaseGenerated (DatabaseGeneratedOption.None)]

注释从我的实体类。然后,我从我的sql服务器手动删除表,并再次使用update-database -VerboseNuGet包管理器控制台。现在,它成功了!