在Entity Framework中检查记录是否存在

41

有人可以告诉我如何检查记录是否存在,如果存在则什么都不做,如果不存在则将记录添加到数据库中吗?

请参见我的代码:

if (isIpnValidated == true)
{
    using (WebApplication1Entities db = new WebApplication1Entities())
    {
        Orders order = new Orders();
        order.UserId = userId;
        order.Date = System.DateTime.Now;
        order.Transaction = txnId;
        order.Amount = Convert.ToDecimal(mcGross);
        order.Email = payerEmail;
        order.Country = residenceCountry;

        db.Orderss.Add(order);
        db.SaveChanges();
    }
}

我只想确保数据库中没有可能的重复。


4
什么构成副本? - user61470
1
抱歉,我想确保 txnId 不存在。 - iggyweb
1
我无法在此函数中使用 Any,我可以使用 Find、Add、AddRange 等,但不幸的是不能使用 Any。 - iggyweb
2
@iggyweb 那你缺少了对 System.Linq 的引用。将其添加到文件顶部,或者获取 Resharper ;) - CodingIntrigue
1
@iggyweb 使用下面sroes的答案,但你应该先开始学习Linq语法。 - CodingIntrigue
显示剩余5条评论
2个回答

70

使用Any

if (isIpnValidated)
{
    using (WebApplication1Entities db = new WebApplication1Entities())
    {
        if (db.Orderss.Any(o => o.Transaction == txnId)) return;

        Orders order = new Orders();
        order.UserId = userId;
        order.Date = System.DateTime.Now;
        order.Transaction = txnId;
        order.Amount = Convert.ToDecimal(mcGross);
        order.Email = payerEmail;
        order.Country = residenceCountry;

        db.Orderss.Add(order);
        db.SaveChanges();
    }
}

1
这意味着他不想更新现有记录... - Maess
10
是的,请看他的问题:“如果它存在,则什么也不做”。 - sroes
1
我绝对不想更新,只有在txnId不存在时才添加。 - iggyweb
1
我可以麻烦再问一件事吗?我想知道如何检查用户是否存在某个订单,并且该订单的日期是今天。我尝试了 if (db.Orderss.Any(o => o.UserId == userId && o.Date == System.DateTime.Now)) return; 但似乎不起作用。 - iggyweb
3
如果(db.Orderss.Any(o => o.UserId == userId && o.Date.Date == System.DateTime.Today))返回,那怎么办? - sroes
这非常糟糕。如果同时使用可能会导致错误!想象一下,如果有人在“Any”和“SaveChanges”之间插入这样的订单会发生什么。你将会有两个重复的订单。 - Konrad

3
using (WebApplication1Entities db = new WebApplication1Entities())
{
   var order = db.Orders.GetAll().Where(x=> x.Transaction == txnId).FirstOrDefault();
   if(order != null) // update
   {
      //.....
      db.SaveChanges();
    }
   else
   {
      // new
   }
}

不需要,因为他要处理订单,所以没有必要运行该语句两次。 - Maess
1
你意识到你在查询整张表中的所有订单,但你仅需要一个吗?其实并不需要使用GetAll()方法。 - makinyelure
除此之外,他正在获取所有列,也不需要使用FirstOrDefault,只需使用count()即可。 - Vahid2015

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接