Nei*_*sey 3 c# entity-framework
我在尝试保存作为父对象的外键的实体时遇到问题.
我有一个amazonProduct实体.还有一个AmazonCompetitivePrice实体,它是amazonProduct上的虚拟列表,如下所示:
public class AmazonProduct
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public virtual int ASIN
        public virtual IList<AmazonProductCompetitivePrice> amazonProductCompetitivePrices = new List<AmazonProductCompetitivePrice>();
}
所以我有一个AmazonProduct,我从数据库中检索,然后将新的AmazonProductCompetitivePrice添加到amazonProduct.
但是当我尝试保存时,我收到以下错误:
违反PRIMARY KEY约束'PK_dbo.AmazonProducts'.无法在对象'dbo.AmazonProducts'中插入重复键.\ r \n语句已终止
看起来它没有意识到我的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;
        }
    }
多数民众赞成...并感谢您的帮助!!
这一行:
amazonProductCompetitivePrice.AmazonProduct = amazonProduct;
 amazonProduct隐式地向上下文添加实例.因为该实例是使用不同的上下文实例检索的,所以当前实例认为它是新的AmazonProduct.你应该附上它,如下所示:
if (amazonProductCompetitivePrice.AmazonProduct != null && amazonProductCompetitivePrice.AmazonProduct.Id != 0)
{
  context.Entry(amazonProductCompetitivePrice.AmazonProduct).State = EntityState.Unchanged;
}
另一种方法:您只能设置外键属性amazonProductCompetitivePrice而不是导航属性.
| 归档时间: | 
 | 
| 查看次数: | 6773 次 | 
| 最近记录: |