1

Teacher レコードを削除しようとすると、次のエラーが表示されます。

DELETE ステートメントは、REFERENCE 制約 "FK_dbo.Department_dbo.Teacher_TeacherID" と競合しました。データベース「MySchoolBook」、テーブル「dbo.Department」、列「TeacherID」で競合が発生しました。ステートメントは終了されました。

私の教師モデル:

public class Teacher : Person
{
    [Key]
    public Guid TeacherID { get; set; }

    public Guid? AccountID { get; set; }

    public virtual ICollection<Classroom> Classrooms { get; set; }

    public virtual Office Office { get; set; }
}

私の部門モデル:

public class Department
{
    [Key]
    public Guid DepartmentID { get; set; }

    [Display(Name = "Administrator")]
    public Guid? TeacherID { get; set; }

    [Required(ErrorMessage = "Name is required.")]
    public String Name { get; set; }

    public virtual Teacher Administrator { get; set; }
    public virtual ICollection<Classroom> Classrooms { get; set; }
}

私のDbContext:

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

            modelBuilder.Entity<Department>()
                .HasOptional(d => d.Administrator);
        }

編集:

私がやりたいことは、部門の TeacherID 列が NULL になるように、教師のレコードを削除することです。

4

1 に答える 1

2

私がやりたいことは、部門の TeacherID 列が NULL になるように、教師のレコードを削除することです。

TeacherIDnull手動で設定する必要があります。EF はこれを行いません。

using (var context = new MyContext())
{
    var teacher = context.Teachers
        .SingleOrDefault(t => t.TeacherID == teacherToDeleteID);

    if (teacher != null)
    {
        var departments = context.Departments
            .Where(d => d.TeacherID == teacherToDeleteID);
        foreach (var department in departments)
            department.TeacherID = null;

        context.Teachers.Remove(teacher);

        context.SaveChanges();
    }
}

編集

ループを削除して、部門のみをコンテキストにロードすることができます。教師を削除すると、自動リレーションシップ修正がTeacherIDFK を設定する可能性がありますnullが、私にはわかりません:

using (var context = new MyContext())
{
    var teacher = context.Teachers
        .SingleOrDefault(t => t.TeacherID == teacherToDeleteID);
    if (teacher != null)
    {
        context.Departments.Where(d => d.TeacherID == teacherToDeleteID).Load();
        context.Teachers.Remove(teacher);
        context.SaveChanges();
    }
}
于 2012-09-20T16:05:59.800 に答える