0

私はその時間で終わりです-編集者私はみんなを悩ませてきました。今すぐ削除する必要があります。大規模な時間スケジュールの削除またはExceptionHoursSetsの削除(一般的な時間パターンの例外)のいずれかです。各ExceptionHoursSetにはWeekSpecがあり、WeekSpecにはDaySpecのコレクション(その日の時間を含む)があります。したがって、明らかに、各例外セットをループして、削除のマークが付けられた日、週、およびセットを削除したいと思います。省略された方法は次のとおりです。

    [HttpPost]
    public ActionResult Edit(Schedule schedule, [Bind(Prefix = "ExceptionHoursSet")] List<ExceptionHoursSet> exceptionHoursSets)
    {
        using (var db = new HoursDb())
        {
            ViewBag.DayNames = HomeServices.DayNames;
            if (ModelState.IsValid)
            {
                schedule.ExceptionHoursSets = exceptionHoursSets;
                foreach (var exceptionHoursSet in exceptionHoursSets)
                {
                    if (!exceptionHoursSet.IsDeleting)
                    {
                        exceptionHoursSet.WeekSpecId = exceptionHoursSet.WeekSpec.WeekSpecId;
                            // for coherency (should this be necessary?)

                        foreach (var daySpec in exceptionHoursSet.WeekSpec.DaySpecs)
                        {
                            db.Entry(daySpec).State = EntityState.Modified;
                            db.SaveChanges();
                        }
                        db.Entry(exceptionHoursSet.WeekSpec).State = EntityState.Modified;
                        db.SaveChanges();

                        db.Entry(exceptionHoursSet).State = EntityState.Modified;
                        db.SaveChanges();
                    }
                    else
                    {
                        var daySpecs = new List<DaySpec>(exceptionHoursSet.WeekSpec.DaySpecs);

                        db.ExceptionHoursSets.Attach(exceptionHoursSet);
                        db.WeekSpecs.Attach(exceptionHoursSet.WeekSpec);
                        foreach (var daySpec in daySpecs)
                        {
                            db.DaySpecs.Attach(daySpec);
                            db.DaySpecs.Remove(daySpec);
                        }
                        db.WeekSpecs.Remove(exceptionHoursSet.WeekSpec);
                        db.ExceptionHoursSets.Remove(exceptionHoursSet);

                        db.SaveChanges();
                    }
                }

                if (HasEditedException(lastExceptionHoursSet))
                {
                    var dayNum = 0;
                    foreach (var daySpec in lastExceptionHoursSet.WeekSpec.DaySpecs)
                    {
                        daySpec.DayNum = dayNum++;
                        daySpec.DaySpecId = Guid.NewGuid();
                        db.DaySpecs.Add(daySpec);
                    }
                    lastExceptionHoursSet.WeekSpec.WeekSpecId = Guid.NewGuid();
                    db.WeekSpecs.Add(lastExceptionHoursSet.WeekSpec);
                    lastExceptionHoursSet.ExceptionHoursSetId = Guid.NewGuid();
                    exceptionHoursSets.Add(lastExceptionHoursSet);
                    db.ExceptionHoursSets.Add(lastExceptionHoursSet);
                }

                db.Entry(schedule).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(schedule);
        }
    }

削除しようとしたexceptionHoursSetにアタッチしようとすると、次のエラーが発生します。

参照整合性制約違反が発生しました:参照制約を定義するプロパティ値が、関係のプリンシパルオブジェクトと依存オブジェクトの間で一貫していません。

これは何ですか?そしてもっと要点を言えば、どうすればそれを取り除くことができますか?

我慢してくれてありがとう、ネイサン・ボンド

4

1 に答える 1

0

そう、見つけた。まず、例外セットが含まれていたスケジュールを添付する必要がありました。次に、その添付ファイルに対して同じエラーが発生しましたが、それは、スケジュールの小道具に統合するという問題を実行していなかったためです。作業は、上記のリストから省略したコードで実行されました。基本的に、ScheduleのWeekSpecプロパティと、一般的な時間パターンを保持する例外セットもあります。ビューからScheduleパラメーターを取得したとき、ScheduleにはIDがあり、WeekSpecの一般時間も独自のIDでした。ただし、WeekSpecのScheduleの外部キーは設定されていません。WeekSpecのIDに設定して初めて、効果的にアタッチできました。したがって、私がしなければならなかったのは、このIDの一致後にスケジュール添付コードを移動することだけで、すべてが正常に機能します。ばかげた質問でごめんなさい。

于 2012-08-06T21:07:12.987 に答える