如果实体存在于数据库中,我想从我的上下文中删除实体,如果它不存在,则将其添加到数据库中。
如何在Entity Framework中使用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();
这样做的最佳方式是什么?
答案 0 :(得分:1)
所以我不确定你的解决方案,但我认为你可能会尝试在太低的水平上混合功能。我的建议是在更高级别执行此操作并尝试获取现有收藏夹然后将其删除或添加它(如果它为空...)
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();
}
}
...
}
答案 1 :(得分:0)
我建议使用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;”位于文件顶部。
答案 2 :(得分:0)
在分离之前,您应该从数据库加载元素。 为什么不试试这个:
//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,则这不是一个好方法。