簡體   English   中英

刪除未在數據庫實體框架中刪除的子實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM