为什么我不能删除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表完全删除。
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();
前