C# 无法删除实体框架asp.net mvc中具有外键关系的实体

C# 无法删除实体框架asp.net mvc中具有外键关系的实体,c#,asp.net-mvc,entity-framework,foreign-keys,C#,Asp.net Mvc,Entity Framework,Foreign Keys,我有两个实体SpaceEvent,RegisteredStudent。我想从空间活动中删除一名注册学生,但我得到了这个例外 操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象 这是我的密码 var id = User.Identity.GetUserId(); Student student = _studentRepository.Find(id

我有两个实体SpaceEvent,RegisteredStudent。我想从空间活动中删除一名注册学生,但我得到了这个例外

操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象

这是我的密码

var id = User.Identity.GetUserId();
Student student = _studentRepository.Find(id);

var spaceEvent = _spaceEventRepository.Find(eventId);
var registeredStudents = spaceEvent.RegisteredStudents;

RegisteredStudent studentToUnregister = registeredStudents.First(w => w.StudentId == student.StudentId);
spaceEvent.RegisteredStudents.Remove(studentToUnregister);
_spaceEventRepository.Save();
这是我的两个实体

public class YogaSpaceEvent
{
    [Key]
    public int SpaceEventId { get; set; }

    [Index]
    [Required]
    public DateTime DateTimeScheduled { get; set; }

    [Required]
    public int AppointmentLength { get; set; }
    public int StatusEnum { get; set; }

    public virtual ICollection<Student.RegisteredStudent> RegisteredStudents { get; set; }

    [Index]
    public int SpaceRefId { get; set; }

    [ForeignKey("SpaceRefId")]
    public virtual Space Space { get; set; }
}

public class RegisteredStudent
{
    [Key]
    public int StudentRegisteredId { get; set; }

    [Index(IsUnique = true)]
    [Required]
    [MaxLength(128)]
    public string AspNetUserRefId { get; set; }

    public DateTime DateRegistered { get; set; }

    public DateTime EventDate { get; set; }

    [Index]
    [Required]
    public int StudentId { get; set; }


    [Index]
    public int SpaceEventRefId { get; set; }

    [ForeignKey("SpaceEventRefId")]
    public virtual SpaceEvent SpaceEvent { get; set; }
}

您的映射创建了一个RegisteredStudent表,其中包含不可为null的SpaceEventRefId列,因此一旦从某个空间事件中删除了某个学生,就必须将其分配到另一个空间事件中,或者SpaceEventRefId应设置为null。如果您的设计允许学生不必参加空间活动,那么SpaceEventRefId应为空,请尝试将public int SpaceEventRefId替换为public int?SpaceEventRefi不希望它加入另一个空间事件。我想同时从表中删除该条目。在这种情况下我需要做什么?我是否应该删除空间事件的外键?您可能不明白此处将删除什么,是否确实要从表student中删除相关的student?就因为他没有参加空间活动?我知道你有一个像RegisteredStudent这样的表,对吧?因此,您当前的设计不允许直接从该表中删除。在不使用存储库的情况下,您始终可以执行类似于context.RegisteredStudent.Removestudent的操作,但在使用存储库时,您需要一些用于RegisteredStudent的存储库。我再次确认,您只能直接从RegisteredStudents中删除已注册的学生,没有其他方法。当您执行类似于spaceEvent.RegisteredStudents.RemovestudentToUnregister的操作时,它只会尝试将外键列SpaceEventRefId设置为null。但它不可为null,因此它抛出异常。因此,从技术上讲,除非您明确删除该行,否则它无法删除该行。