如果实体框架中存在则删除实体,如果不存在则添加实体
本文关键字:实体 如果 如果不 不存在 添加 删除 存在 框架 | 更新日期: 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,则不是一个好方法。