2

一部のデータを削除しようとしていますが(とにかく、どれほど難しいですか?)、モデルオブジェクトから複雑なタイプのプロップを削除すると、ICollectionプロップの内容も混在します。コードは次のとおりです。

    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(string name)
    {
        using (var db = new HoursDb())
        {
            db.Configuration.ProxyCreationEnabled = false;

            var schedule = db.Schedules.Where(s => s.ScheduleId == name)
                .Include(s => s.WeekSpec)
                .Include(s => s.WeekSpec.DaySpecs)
                .Include(s => s.ExceptionHoursSets)
                .Include(s => s.ExceptionHoursSets.Select(e => e.WeekSpec))
                .Include(s => s.ExceptionHoursSets.Select(e => e.WeekSpec.DaySpecs))
                .FirstOrDefault();
            if (schedule == null)
            {
                return View("404");
            }


            var daySpecs = new List<DaySpec>(schedule.WeekSpec.DaySpecs);
            foreach (var daySpec in daySpecs)
            {
                db.DaySpecs.Remove(daySpec);
            }
            db.WeekSpecs.Remove(schedule.WeekSpec);

            var exceptionHoursSets = new List<ExceptionHoursSet>(schedule.ExceptionHoursSets);
            foreach (var exceptionHoursSet in exceptionHoursSets)
            {
                daySpecs = new List<DaySpec>(exceptionHoursSet.WeekSpec.DaySpecs);
                foreach (var daySpec in daySpecs)
                {
                    db.DaySpecs.Remove(daySpec);
                    db.SaveChanges();
                }
                db.WeekSpecs.Remove(exceptionHoursSet.WeekSpec);
                db.SaveChanges();
                db.ExceptionHoursSets.Remove(exceptionHoursSet);
            }

            db.Schedules.Remove(schedule);
            db.SaveChanges();

            return RedirectToAction("Index");
        }
    }

私がラインを発射する前に

db.WeekSpecs.Remove(schedule.WeekSpec);

ExceptionHoursSetsには、たとえば3つの項目があります。WeekSpecを削除すると、ゼロになります。ええ 何か案は?

アップデート

HoursDbクラスのコードは次のとおりです。

using System.Data.Entity;
using LibraryAdmin.Models;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace ####.DAL
{
    public class HoursDb : DbContext
    {
        public DbSet<DaySpec> DaySpecs { get; set; }
        public DbSet<WeekSpec> WeekSpecs { get; set; }
        public DbSet<ExceptionHoursSet> ExceptionHoursSets { get; set; }
        public DbSet<Schedule> Schedules { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

また、役立つ場合は、DaySpecsに一般的な建物の営業時間と営業時間が含まれています。それらはWeekSpecsに含まれています。
スケジュールには、一般的な営業時間を説明するWeekSpecと、一連のExceptionHoursSetが含まれています。
これらには、前述の一般時間の例外を説明するWeekSpecがあります。

4

2 に答える 2

0

WeekSpecとExceptionHoursSetの関係についてのデータベースでは、カスケード削除オプションが有効になっていると思います。したがって、WeekSpecを削除すると(ExceptionHoursSetにあるのと同じWeekSpecが削除され、カスケード削除があるため)、EFはExceptionHoursSetオブジェクトも削除します。

これは、関係にカスケード削除オプションを使用し、foreachを使用してすべての子オブジェクトを削除しないための正しい解決策になると思います。もちろん、スケジュールなしでWeekSpecs / ExceptionHoursSet / DaySpecsを作成することが不可能であると100%確信している場合にのみ使用してください。

于 2012-08-15T13:42:24.133 に答える
0

varスケジュールが初期化された後、ExceptionHoursSetsを削除するforeachを前面に移動し、最後のdb.SaveChangesを除くすべてを削除することは機能しているようです。なぜそうなるのか、何がなかったのかはまだわかりませんので、追加情報をいただければ幸いです。

于 2012-08-15T14:02:15.840 に答える