为什么我不能删除EF和ASP的嵌套实体对象?净MVC

本文关键字:实体 嵌套 对象 MVC ASP 不能 删除 EF 为什么 | 更新日期: 2023-09-27 18:16:36

我有两个对象。Profile和ProfileImage。我的上下文设置为获取配置文件,我想通过配置文件删除ProfileImage(不仅仅是引用),首先获取配置文件,然后获取ProfileImage并像这样删除它:

using (var dbContext = new myContext())
        {
            var profile = dbContext.profiles.Where(i => i.ApplicationUserGuid == userId).First();
            var profileImageToDelete = profile.profileImages.Where(i => i.YogaProfileImageId == Convert.ToInt32(idToRemove)).First();
            profile.ProfileImages.Remove(profileImageToDelete);
            dbContext.SaveChanges();
        }

但我得到一个错误时,保存说:

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

这是我的两个实体对象:

public class Profile
{
    public Profile()
    {
        ProfileImages = new List<ProfileImage>();
    }
    [Key]
    public int ProfileId { get; set; }
    [Column(TypeName = "VARCHAR")]
    [StringLength(36)]
    [Index]
    public string ApplicationUserGuid { get; set; }
    public bool IsActive { get; set; }
    public virtual ICollection<ProfileImage> ProfileImages { get; set; } //one-to-many }

public class ProfileImage
{
    [Key]
    public int ProfileImageId { get; set; }
    public int ProfileRefId { get; set; }
    [ForeignKey("ProfileRefId")]
    public virtual Profile Profile { get; set; }
    public byte[] CroppedImage { get; set; }
    public byte[] ImageThumbnailCropped { get; set; }
    public bool IsMainImage { get; set; }
}

我读了一些关于级联删除,但不确定这是我需要做什么,或者我需要做什么,让图像从ProfileImage表完全删除。

为什么我不能删除EF和ASP的嵌套实体对象?净MVC

entitystatetracker看不到对profileImage的任何修改,因此从内存集合中删除该实体不会保存回数据库。

正如Faisal所提到的,你可以通过将对象的entitystate设置为deleted来让entitystatetracker知道对象应该从数据库中删除:

dbContext.Entry(profileImageToDelete).State = EntityState.Deleted;
但是,除了将其标记为已删除之外,您还可以使用:
dbContext.profileImages.Remove(profileImageToDelete);
dbContext.SaveChanges();

尝试添加:

dbContext.Entry(profileImageToDelete).State = EntityState.Deleted;

应用dbContext.SaveChanges();