如果实体框架中存在则删除实体,如果不存在则添加实体

本文关键字:实体 如果 如果不 不存在 添加 删除 存在 框架 | 更新日期: 2023-09-27 18:15:08

我想从我的上下文中删除实体,如果它存在于数据库中,如果它不存在,它被添加到数据库。

我怎么能做到这一点使用EntityState在实体框架?

我想要这样的东西:

var fav = new ProductFavorite()
{
    ProductId = productId,
    UserId = User.Identity.GetUserId()
};
if (_db.Entry(fav).State == EntityState.Detached)
{
    _db.Entry(fav).State = EntityState.Added;
}
else
{
    _db.Entry(fav).State = EntityState.Deleted;
}
_db.SaveChanges();

做这件事的最好方法是什么?

如果实体框架中存在则删除实体,如果不存在则添加实体

所以我不确定你的解决方案,但我认为你可能试图在这里混合功能在一个太低的水平。我的建议是在更高的级别上做到这一点,并尝试获得现有的最爱,然后删除它或添加它,如果它是null…

public class FavoriteService
{
    ...
    public void ToggleFavourite(int productId, int userId)
    {
        using (context = new MyDbContext())
        {
            var fav = context.ProductFavorites
                .SingleOrDefault(f => f.ProductId == productId && f.UserId == userId);
            if(fav != null)
            {
                context.ProductFavorites.Remove(fav);
            } 
            else 
            {
                context.ProductFavorites.Add(new ProductFavorite
                {
                    ProductId = productId,
                    UserId = userId
                });
            }
            context.SaveChanges();
        }
    }
    ...
}

我建议使用Linq查询来完成此任务。

        var existingEntry = _db.ProductsTable.FirstOrDefault(s => s.ProductId == productId);
        if (existingEntry != null)
        {
            _db.ProductsTable.Remove(existingEntry);
        }
        else
        {
            _db.ProductsTable.Add(new ProductFavorit()
            {
                ProductId = productId,
                UserId = User.Identity.GetUserId()
            });
        }
        _db.SaveChanges();

将"ProductsTable"替换为上下文中的表名,并在文件的顶部包含"using System.Linq;"

应该先从数据库中加载元素,然后再分离它。你为什么不试试这个呢:

  //You should set the value of productId and userId first
  // Assuming _db.Products is your DbSet<Product> property in the DbContext class
  var fav = _db.Products.FirstOrDefault(x => x.ProductId = productId && x.UserId == userId);
  if(fav == null){
  //That mean you should add the element
    _db.Products.Add(fav);
  }
  else{
    _db.Products.Remove(fav);
  }
  _db.SaveChanges();

建议在断开连接的场景中使用EntityState,但如果使用单个DbContext,则不是一个好方法。