Entity Framework Удалить Один К Нулю Один Replationship

Я застрял на проблеме с удалением объектов отношений из БД. Все работает хорошо на моем localdb, но это вызывает ошибку, когда я запускаю его на сервере.
У меня есть следующая модель:

public class Article
{
    public Article()
    {
        Paragraphs = new List<Paragrap>();
    }

    public int ID { get; set; }
    public DateTime PostedDate { get; set; }
    public string Title { get; set; }
    public bool isPosted { get; set; }

    public virtual ICollection<Paragrap> Paragraphs { get; set; }
}

public class Paragrap
{
    public int ID { get; set; }
    public int ArticleID { get; set; }
    public string Text { get; set; }
    //[ForeignKey("PictureRefID")]
    //public int PictureID { get; set; }
    public virtual Picture Picture { get; set; }
    [ForeignKey("ArticleID")]
    public virtual Article Article { get; set; }
}

public class Picture
{
    [Key, ForeignKey("Paragrap")]
    public int ID { get; set; }
    public string PictureURL { get; set; }
    public string Description { get; set; }
    public virtual Paragrap Paragrap{ get; set; }
}

И когда я пытаюсь удалить статью, я также хочу удалить абзацы и фотографии. Если я правильно понимаю, проблема заключается в удалении изображений из БД, но я могу ошибаться. Вот удалить метод:

        public async Task<ActionResult> DeleteConfirmed(int id)
    {
        Article article = db.Articles.Find(id);
        List<Paragrap> ParToDelete = new List<Paragrap>();
        List<Picture> PicToDelete = new List<Picture>();
        List<Ingreadient> IngToDelete = new List<Ingreadient>();
        try
        {
            var p = from c in db.Paragraps
                    where c.ArticleID == id
                    select c;
            ParToDelete.AddRange(p);

            foreach (var item in p)
            {
                var i = item.ID;
                PicToDelete.Add(db.Pictures.Find(i));
            }
            foreach (var item in article.Ingreadient)
            {
                IngToDelete.Add(item);
            }
            db.Paragraps.RemoveRange(ParToDelete);
            db.Pictures.RemoveRange(PicToDelete);
            db.Articles.Remove(article);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        catch
        {
            Article art = await db.Articles.FindAsync(id);
            return View(article);
        }
    }

ИД абзаца и ИД изображения 1 к 1 в дБ(сервере).
Кто-нибудь знает, в чем проблема?!

Обновление
После дополнительной отладки мне кажется, что проблема находится в БД.Фотографии.Найти (i) метод. I checked Picture DB ID and they are the same as value passed to method.

1 ответ

  1. Не уверен, что это чистое решение, но, по крайней мере, он работает сейчас. Проблема была в db.Изображение.Find () method, what did throw me An error. Обходной путь, который я использовал, состоял в том, чтобы получить все фотографии в список (что работало по какой-то причине) и отсортировать их вручную

    var p = from c in db.Paragraps
                    where c.ArticleID == id
                    select c;
            ParToDelete.AddRange(p);
            var Test = db.Pictures.ToList();
            foreach (var item in p)
            {
                foreach(var obj in Test)
                    if(item.ID == obj.ID)
                          PicToDelete(obj);
            }
            foreach (var item in article.Ingreadient)
            {
                IngToDelete.Add(item);
            }
            db.Paragraps.RemoveRange(ParToDelete);
            db.Pictures.RemoveRange(PicToDelete);
            db.Articles.Remove(article);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");