2017-01-12 2 views
0

Я столкнулся с проблемой удаления объектов отношений с db. Все работает отлично на моем localdb, но оно вызывает ошибку при запуске на сервере. У меня есть следующее модель:Entity Framework Remove One-to-Zero-One Replationship

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

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

 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 в db (сервер). Кто-нибудь знает, в чем проблема?

UPDATE После дополнительной отладки я кажется, проблема в (I) методом db.Pictures.Find. Я проверил Picture DB ID, и они совпадают с значением, переданным методу.

+0

гораздо лучшим подходом было бы положить 'IsActive' флаг на объекте и просто установить это «ложь». Мягкое удаление, как это, в долгосрочной перспективе является гораздо лучшей практикой. Разматывание внешних ключей * отстой *. – nurdyguy

+0

Попробуйте удалить фотографии перед удалением абзацев. Когда вы удаляете абзац, у вас есть внешний ключ на картинке, который затем недействителен. – nurdyguy

+0

Удаление фотографий перед параграфом не сработало. Я в основном смущен, потому что на localdb все работает, но не на сервере – Demon

ответ

0

Не уверен, что это чистое решение, но по крайней мере оно работает сейчас. Проблема была в методе db.Picture.Find(), что вызвало ошибку. Чтобы обойти эту проблему, что я использовал в том, чтобы получить все изображения в списке (то, что работал по какой-то причине) и сортировать их вручную из

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"); 
Смежные вопросы