2016-04-11 18 views
0

if文(S)バインドされているオブジェクトのプロパティは、データベースにすでにあるレコードの一致した場合にのみ実行する必要があり、以下:基本的に条件文は常に真である

[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); 
    } 

を、ユーザーは、特定の日付の場合にPostPreIDが2であるレコードを、データベースにすでにレコードがある場合は追加できません。PostPreIDは2です。同じ論理がPostPreIDは、私がデバッグしている3

に等しい、と私は、データベースがそれらのレコードが含まれていません知っている日付のPostPreIDのための両方の2と3で入力したときのために行くが、文が含む場合は何らかの理由でネスト.Anyメソッドは常にtrueに解決されます。

何か助けていただければ幸いです。

+0

'DbFunctions.TruncateTime'は正しいですか?また、これをデバッグするには、 'db.OL.FirstOrDefault'を呼び出して、同じ式を渡して、あなたが期待していないレコードを見てください。 – David

+0

'DbFunctions.TruncateTime'のソースコードを共有する –

+0

@DavidPineこれはEFの一部です。https://msdn.microsoft.com/en-us/library/dn220142(v=vs.113).aspx – juharr

答えて

0

問題はDbFunctions.TruncateTime(x.Date)に関連しているようです。だから、TruncateTimeは、時間を削除し、ちょうど2つの日付を比較して、例えば:

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

はtrueとして評価されます。つまり、時刻に関係なく、日付とIDが同じである限り、.Anyは常にtrueになります。

+0

'.Any'に1つ以上の条件がある場合、それはどのように真実になりますか? ** ** **データベース内のすべてのレコードが、 'oLevel'オブジェクトにバインドされているものと同じ' date' **および** 'PostPreID'を持っている場合は、エラーを送信してください。私は日付を比較するだけではありません。 –

+0

私の指摘は、両方の条件が真であるということです。条件が十分明確でないことだけです。日付(切り捨てられた)とIDは同じです。 –

+0

私は条件文に 'if(db.OL.Any(x => DbFunctions.TruncateTime(x.Date)== DbFunctions.TruncateTime(oLevel.Date)&& x.PostPreID == oLevel.PostPreID && xを追加しました。 AID == oLevel.AID)) 'と書いてありました。もっと明白だと思いますか? :) –