我在尝试保存作为父对象的外键的实体时遇到问题。
我有一个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;
}
}
多数事情......感谢帮助!!
答案 0 :(得分:5)
这一行:
amazonProductCompetitivePrice.AmazonProduct = amazonProduct;
隐式地将 amazonProduct
实例添加到上下文中。因为该实例是使用不同的上下文实例检索的,所以当前实例认为它是新的AmazonProduct
。你应该附上它,如下所示:
if (amazonProductCompetitivePrice.AmazonProduct != null && amazonProductCompetitivePrice.AmazonProduct.Id != 0)
{
context.Entry(amazonProductCompetitivePrice.AmazonProduct).State = EntityState.Unchanged;
}
另一种方法:您只能为amazonProductCompetitivePrice
而不是导航属性设置外键属性。
答案 1 :(得分:0)
我有这个问题 首先我删除了
[DatabaseGenerated(DatabaseGeneratedOption.None)]
来自我的实体类的注释。
然后,我手动从我的SQL服务器中删除了表并再次使用
update-database -Verbose
在NuGet
包管理器控制台中。
现在,它有效!