0

だから私の人のテーブルに...私はID、名前、休日が残っています。

これは休日予約アプリケーション用であり、ユーザーがカレンダーから日付を選択してボタンをクリックすると、選択された各日付がDBに保存されます。各休日が予約されるため、残りの休日を1つ差し引いてみますが、回復していないようです。

//listHolidays in correct format dd/mm/yy
    [HttpPost]
    public ActionResult listHolidays(Holiday holiday, Person person , int? PersonId, string HolidayDate, string endDate, string AlreadyExists)
    {
        db.People.Attach(person);
        //int holidaysRemaining = 20;
        //person.HolidaysRemaining = holidaysRemaining;    

        DateTime startDates = Convert.ToDateTime(HolidayDate);
        DateTime endDates = Convert.ToDateTime(endDate);

    try{

        while (startDates <= endDates)
        {
            if (startDates.DayOfWeek != DayOfWeek.Saturday && startDates.DayOfWeek != DayOfWeek.Sunday)
            {                 
                //if user selects Holiday that already exists, wont add it to Db
                //gets string, and uses the previously converted to dateTime 'startDate'
                //id so only applies to person creating holidays
                ViewBag.CantDuplicateHolidays = String.IsNullOrEmpty(AlreadyExists) ? "date" : "";
                var dates = from d in db.Holidays
                where d.HolidayDate == startDates && d.PersonId == PersonId
                select d;

                // <= 0..so if holiday does not already exist
                if (dates.Count() <= 0)
                {
                  //  holidaysRemaining--;
                    person.HolidaysRemaining = person.HolidaysRemaining - 1;

                    Holiday holiday1 = new Holiday();
                    holiday1.PersonId = PersonId.Value;
                    holiday1.HolidayDate = startDates;

                    db.Holidays.AddObject(holiday1);


                    db.SaveChanges();
                    //say start date is 10. AddDays(1) will make it 11 then return it to startDates in 'startDates' = startdates,
                    //but doesnt chage the value of startdates = 'startdates'
                }

            }
        }

        startDates = startDates.AddDays(1);
    }


    finally
    {
        db.People.Detach();
    }

    return RedirectToAction("Index");
}
4

2 に答える 2

1

私はあなたの問題がここにあると思います:

if (dates.Count() <= 0)
    {
    //  holidaysRemaining--;
    person.HolidaysRemaining--;

次のように変更してみてください。

if (dates.Count() <= 0)
    {
    //  holidaysRemaining--;
    person.HolidaysRemaining = person.HolidaysRemaining - 1;

編集

また、実際にデータベースを人で更新することはありませんか?

db.People.Attach(person);

db.SaveChanges();

もう一度編集

これを試して:

[HttpPost] public ActionResult listHolidays(Holiday holiday、Person person、int?PersonId、string HolidayDate、string endDate、string AlreadyExists){
// int holidaysRemaining = 20; //person.HolidaysRemaining = holidaysRemaining;

        DateTime startDates = Convert.ToDateTime(HolidayDate);
        DateTime endDates = Convert.ToDateTime(endDate);

        while (startDates <= endDates)
        {
            if (startDates.DayOfWeek != DayOfWeek.Saturday && startDates.DayOfWeek != DayOfWeek.Sunday)
            {                 
                    //if user selects Holiday that already exists, wont add it to Db
                    //gets string, and uses the previously converted to dateTime 'startDate'
                    //id so only applies to person creating holidays
                    ViewBag.CantDuplicateHolidays = String.IsNullOrEmpty(AlreadyExists) ? "date" : "";
                    var dates = from d in db.Holidays
                    where d.HolidayDate == startDates && d.PersonId == PersonId
                    select d;

                    // <= 0..so if holiday does not already exist
                    if (dates.Count() <= 0)
                    {
                      //  holidaysRemaining--;
                        person.HolidaysRemaining = person.HolidaysRemaining - 1;

                        Holiday holiday1 = new Holiday();
                        holiday1.PersonId = PersonId.Value;
                        holiday1.HolidayDate = startDates;

                        db.Holidays.AddObject(holiday1);
            db.People.Attach(person);

                        db.SaveChanges();
                        //say start date is 10. AddDays(1) will make it 11 then return it to startDates in 'startDates' = startdates,
                        //but doesnt chage the value of startdates = 'startdates'
                    }

            }

            startDates = startDates.AddDays(1);
        }

        return RedirectToAction("Index");
    }
于 2012-12-13T16:59:42.777 に答える
1

おそらくこれが最も簡単な解決策です。

交換:

person.HolidaysRemaining = person.HolidaysRemaining - 1;

と:

var dbPerson = from p in db.People where p.Id == PersonId select p;
dbPerson[0].HolidaysRemaining--;

または、personオブジェクトを持っているので、それをアタッチすることについて話し合っていました。

    db.People.Attach(person)
    try {
        // ... loop and everything else here
    } finally {
        db.People.Detach(person);
    }
} // end of method

ただし、これはもう少し脆弱であり、にPersonオブジェクトがまだない場合にのみ必要になりますdb.People

person注:との両方PersonIdがに渡されるのは少し奇妙に思えlistHolidays()ます。

于 2012-12-13T20:36:55.567 に答える