删除未在数据库实体框架中删除的子实体

时间:2015-03-21 00:28:03

标签: c# entity-framework

我有两个实体“YogaSpace”和“YogaSpaceImage”我正在删除一个图像并尝试删除该行,而只是将对该瑜伽空间实体的引用置空。

这是我的实体。

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; }
}

以下是从db中删除一个图像的方法。

[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");
    }

这里是我的repo中的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试图使用它,所以我不需要创建另一个回购。 enter image description here

1 个答案:

答案 0 :(得分:0)

您需要将实体标记为已删除。

yogaSpace.Images.Remove(image);
context.YogaSpaceImages.Remove(image)

您的另一个选择是标记您使用.WillCascadeOnDelete()

进行映射

E.g。

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; }
}