[英]Removing child entity not deleting in database entity framework
我有两个实体“ YogaSpace”和“ YogaSpaceImage”我正在删除图像并尝试删除该行,相反,它只是使对YogaSpace实体的引用无效。
这是我的实体。
public class YogaSpace
{
public int YogaSpaceId { get; set; }
public virtual ICollection<YogaSpaceImage> Images { get; set; }
}
public class YogaSpaceImage
{
public int YogaSpaceImageId { get; set; }
public byte[] Image { get; set; }
public byte[] ImageThumbnail { get; set; }
public string ContentType { get; set; }
public int Ordering { get; set; }
}
这是从数据库删除一个图像的方法。
[HttpPost]
public ActionResult RemoveImage(string id, string imageId)
{
YogaSpace yogaSpace = yogaSpaceRepository.Find(Convert.ToInt16(id));
YogaSpaceImage image = yogaSpace.Images.FirstOrDefault(si => si.YogaSpaceImageId == Convert.ToInt16(imageId));
yogaSpace.Images.Remove(image);
yogaSpaceRepository.InsertOrUpdate(yogaSpace);
yogaSpaceRepository.Save();
return Json("removed");
}
这是我回购insertorupdate()的内容
public void InsertOrUpdate(YogaSpace yogaSpace)
{
if (yogaSpace.YogaSpaceId == default(int))
{
context.Entry(yogaSpace).State = System.Data.Entity.EntityState.Added;
}
else
{
context.Entry(yogaSpace).State = System.Data.Entity.EntityState.Modified;
}
}
这就是结果。 您会看到该行没有被删除,null被放入引用列。 我没有YogaSpaceImage实体的存储库,只有YogaSpace,因此可以尝试使用它,因此不必创建另一个存储库。
您需要将实体标记为已删除。
yogaSpace.Images.Remove(image);
context.YogaSpaceImages.Remove(image)
您的另一个选择是使用.WillCascadeOnDelete()
标记您的映射
例如
protected override void OnModelCreating(DbModelBuilder mb)
{
mb.Entity<YogaSpace>().HasMany(p => p.Images )
.WithRequired()
.HasForeignKey(c => c.YogaSpaceImageId)
.WillCascadeOnDelete();
}
另一个选项是将YogaSpaceImage
上的ForeignKey返回YogaSpace
(如果它是1 YogaSpace
-0-many Image
的映射),并标记出YogaSpaceImage.YogaSpace
外键。 因此,每当EF尝试删除外键时,它将自动删除图像。
public class YogaSpaceImage
{
public int YogaSpaceImageId { get; set; }
public byte[] Image { get; set; }
public byte[] ImageThumbnail { get; set; }
public string ContentType { get; set; }
public int Ordering { get; set; }
public int YogaSpaceId { get; set; }
[Required] <-- This will delete the image, if removed from parent
public virtual YogaSpace YogaSpace { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.