Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 违反主键约束';PK_dbo.AmazonProducts';。无法在对象中插入重复的键_C#_Entity Framework - Fatal编程技术网

C# 违反主键约束';PK_dbo.AmazonProducts';。无法在对象中插入重复的键

C# 违反主键约束';PK_dbo.AmazonProducts';。无法在对象中插入重复的键,c#,entity-framework,C#,Entity Framework,我在尝试保存作为父对象外键的实体时遇到问题 我有一个amazonProduct实体。以及AmazonCompetitivePrice实体,它是amazonProduct上的虚拟列表,如下所示: public class AmazonProduct { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public virtual int ASIN public virt

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

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

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

        public virtual IList<AmazonProductCompetitivePrice> amazonProductCompetitivePrices = new List<AmazonProductCompetitivePrice>();
}
这让我得到了亚马逊的产品。。然后保存:

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设置外键属性,而不是导航属性。

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

[数据库生成(DatabaseGeneratedOption.None)]

来自实体类的注释。 然后,我手动从sql server中删除了该表,并再次使用它
更新数据库-详细
NuGet
软件包管理器控制台中。
现在,它起作用了

如何保存实体?听起来您完全知道问题所在--您无法保存它。项目已经存在,您必须修改现有项目。为了修改一个项目,您需要“自定义”代码,或者您必须读入原始实体并进行修改,然后框架才能保存它。请显示完整的代码示例:检索、更新和保存更改。我对检索到的其他更改进行了编辑。。和saveAmazonProduct已存在于数据库中。我只想将带有外键的AmazonProductCompetitivePrice添加到我从数据库检索到的amazonProduct。如果有道理的话?:/>amazonProduct已经存在于数据库中-是的,但是用于保存更改的上下文实例将
amazonProduct
视为新项目。谢谢Dennis。我花了一整天的时间来找出问题所在。在不同的上下文中检索到的相关对象的注释让我很高兴!
amazonProductCompetitivePrice.AmazonProduct = amazonProduct;
if (amazonProductCompetitivePrice.AmazonProduct != null && amazonProductCompetitivePrice.AmazonProduct.Id != 0)
{
  context.Entry(amazonProductCompetitivePrice.AmazonProduct).State = EntityState.Unchanged;
}