2016-04-11 26 views
0

eğer deyimi (ler) binded ediliyor nesnesinin bir özelliği veritabanında zaten bir kayıt ile eşleşirse sadece yürütmek gerekir: TemeldeŞartlı Bildirimi her zaman True

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "ID,AID,Date,PostPreID")] OL oLevel) 
{ 

     if (ModelState.IsValid) 
     { 
      if(oLevel.PostPreID == 2) 
      { 
       if (db.OL.Any(x => DbFunctions.TruncateTime(x.Date) == DbFunctions.TruncateTime(oLevel.Date) && x.PostPreID == oLevel.PostPreID)) 
        { 
         ModelState.AddModelError("PostPreID", "There is already a record for this Date!"); 
         return View(oLevel); 
        } 
       else 
       { 
        db.OL.Add(oLevel); 
        db.SaveChanges(); 
        return RedirectToAction("Index", new { id = oLevel.AID }); 
       } 
      } 

      if(oLevel.PostPreID == 3) 
      { 
       if (db.OL.Any(x => DbFunctions.TruncateTime(x.Date) == DbFunctions.TruncateTime(oLevel.Date) && x.PostPreID == oLevel.PostPreID)) 
       { 
        ModelState.AddModelError("PostPreID", "There is already a record for this Date!"); 
        return View(oLevel); 
       } 
       else 
       { 
        db.OL.Add(oLevel); 
        db.SaveChanges(); 
        return RedirectToAction("Index", new { id = oLevel.AID }); 
       } 
      } 

      db.OL.Add(oLevel); 
      db.SaveChanges(); 
      return RedirectToAction("Index", new { id = oLevel.AID }); 
     } 
     return View(oLevel); 
    } 

, bir Kullanıcı, PostPreID'un belirli bir tarih için 2'ye eşit olduğu bir kayıt ekleyememelidir. Aynı mantık PostPreID ben debug gelmiş 3.

eşittir ve ben veritabanı kayıtları içermez biliyorum tarihlerde PostPreID hem 2 ve 3'te girildiğinde için de geçerli, ama deyim içeren eğer nedense iç içe .Any yöntemi her zaman doğru olarak çözülür.

Herhangi bir yardım için teşekkür ederiz.

+0

'DbFunctions.TruncateTime''in doğru olduğundan emin misiniz? Ayrıca, bu hata ayıklamak için, 'db.OL.FirstOrDefault' işlevini çağırın ve beklemediğiniz bir kaydı görmek için aynı ifadeyi iletin. – David

+0

"DbFunctions.TruncateTime" –

+0

@DavidPine için kaynak kodunu paylaşın https://msdn.microsoft.com/en-us/library/dn220142(v=vs.113).aspx – juharr

cevap

0

Sorun, DbFunctions.TruncateTime(x.Date) ile ilgili görünüyor. Yani TruncateTime defa çıkartılıp sadece örneğin, iki tarihleri ​​karşılaştırır:

'4/11/2016 12:48 PM' == '4/11/2016 6:37 AM' 

olarak gerçek değerlendirmek istiyorum. Bu, tarihler ve kimlikler aynı olduğu sürece, zamandan bağımsız olarak, .Any her zaman doğru olacağı anlamına gelir.

+0

kredisi verebilirsiniz Eğer '.Any'de 1'den fazla durum varsa bu nasıl olabilir? Diyorum ki * Eğer veritabanında herhangi bir ** kaydı 'oLevel' nesnesinde bağlanan ile aynı' tarih' ** VE ** 'PostPreID''ye sahipse, sonra bir hata gönderir *. Ben sadece tarihleri ​​kıyaslamıyorum. –

+0

Benim amacım, her iki koşulun da doğru olması, koşulların yeterince açık olmaması.Her ikisi de tarihler (bir kez kesilmiş) ve kimlikler aynıdır. –

+0

Tamam. Peki benim koşullu ifadeye ekledim: if (db.OL.Any (x => DbFunctions.TruncateTime (x.Date) == DbFunctions.TruncateTime (oLevel.Date) && x.PostPreID == oLevel.PostPreID && x. AID == oLevel.AID)) ve çalıştı. daha açık olduğunu tahmin et? :) –