2010-03-10 2 views
2

У меня есть две таблицы без каскадного удаления. Я хочу удалить родительский объект со всеми дочерними объектами. Я делаю это такEntity Framework удалить дочерний объект

//get parent object 
return _dataContext.Menu.Include("ChildMenu").Include("ParentMenu").Include("Pictures").FirstOrDefault(m => m.MenuId == id); 
//then i loop all child objects 
var picList = (List<Picture>)menu.Pictures.ToList(); 

for (int i = 0; i < picList.Count; i++) 
{ 
    if (File.Exists(HttpContext.Current.Server.MapPath(picList[i].ImgPath))) 
    { 
    File.Delete(HttpContext.Current.Server.MapPath(picList[i].ImgPath)); 
    } 
    if (File.Exists(HttpContext.Current.Server.MapPath(picList[i].ThumbPath))) 
    { 
    File.Delete(HttpContext.Current.Server.MapPath(picList[i].ThumbPath)); 
    } 

    //**what must i do here?** 
    //menu.Pictures.Remove(picList[i]); 
    //    DataManager dm = new DataManager(); 
    //    dm.Picture.Delete(picList[i].Id); 

    //menu.Pictures.de 
    //_dataContext.SaveChanges(); 
    //picList[i] = null; 

} 

//delete parent object 
_dataContext.DeleteObject(_dataContext.Menu.Include("ChildMenu").Include("ParentMenu") 
    .Include("Pictures").FirstOrDefault(m => m.MenuId == id);); 
_dataContext.SaveChanges(); 

ответ

5

Достаточно установить

<OnDelete Action="Cascade" />
для конца мастер объединения в CSDL part модели.
В этом случае ваш код будет работать.

+3

Недостаточно. Вам нужно либо: 1) загрузить все связанные сущности или 2) имеют каскад в БД. –

1

Мое положение было несколько иным, и потребовалось некоторое время, чтобы исправить это, поэтому я счел необходимым документировать. У меня есть две связанные таблицы, цитаты и QuoteExtension:

  • Цитата (Родитель, первичный ключ QuoteId)
  • QuoteExtension (Вычисляемые поля для цитирую, первичных и внешних ключей QuoteId)

я не сделал должны установить действие OnDelete, чтобы заставить его работать, но комментарий Крейга (если бы я мог проголосовать за это больше, чем я хотел бы!), я открыл для себя эту проблему. Я пытался удалить Quote, когда QuoteExtension не был загружен. Поэтому я нашел два способа, которые работали:

var quote = ent.Quote.Include("QuoteExtension").First(q => q.QuoteId == 2311); 
ent.DeleteObject(quote); 
ent.SaveChanges(); 

Или:

var quote = ent.Quote.First(q => q.QuoteId == 2311); 
if (quote.QuoteExtension != null) 
    ent.Refresh(RefreshMode.ClientWins, quote.QuoteExtension); 
ent.DeleteObject(quote); 
ent.SaveChanges(); 

Интересно, пытаясь удалить QuoteExtension вручную не работает (хотя это может быть, если я включил ent.SaveChanges() в средний - это имеет тенденцию происходить только в конце единицы работы в этой системе, поэтому я хотел чего-то, что не полагалось на это.

Смежные вопросы