В EF эффективно ли удалять родительскую строку, удаляя дочерние строки, ссылающиеся на нее сначала через клоны дочерних строк? - PullRequest
1 голос
/ 28 ноября 2010
        public void Delete(Dinner dinner)
        {
            List<RSVP> rsvps = dinner.RSVPs.ToList();// This clone looks inefficient.

            foreach (RSVP rsvp in rsvps)
                entities.RSVPs.DeleteObject(rsvp);

            entities.Dinners.DeleteObject(dinner);
        }

alt text

ВОПРОС:

Удаление родительской строки путем удаления дочерних строк, ссылающихся на нее сначала через клоны дочерних строк, выглядит неэффективно.

Дублирование дочерних строк потребует огромных ресурсов, я думаю.

Если так, то какой путь лучше?

РЕДАКТИРОВАТЬ 1:

namespace NerdDinner.Models
{
    public class DinnerRepository
    {
        private NerdDinnerEntities entities = new NerdDinnerEntities();

        public IQueryable<Dinner> FindAllDinners()
        {
            return entities.Dinners;
        }

        public IQueryable<Dinner> FindUpcomingDinners()
        {
            return from dinner in entities.Dinners
                   where dinner.EventDate > DateTime.Now
                   orderby dinner.EventDate
                   select dinner;
        }

        public Dinner GetDinnerByID(int DinnerID)
        {
            return entities.Dinners.FirstOrDefault(d => d.DinnerID == DinnerID);
        }

        public void Add(Dinner dinner)
        {
            entities.Dinners.AddObject(dinner);
        }

        public void Delete(Dinner dinner)
        {
            //List<RSVP> rsvps = dinner.RSVPs.ToList();

            //foreach (RSVP rsvp in dinner.RSVPs)
            //    entities.RSVPs.DeleteObject(rsvp);

            entities.Dinners.DeleteObject(dinner);
        }

        public void Save()
        {
            entities.SaveChanges();
        }
    }
}

1 Ответ

1 голос
/ 28 ноября 2010

Установите правило удаления каскадным для внешнего ключа, тогда при удалении объекта-ужина база данных автоматически удалит все дочерние записи.

Имейте в виду, что это, вероятно, не будет отражено до EF, поэтому любые объекты, уже находящиеся в памяти, не будут помечены как удаленные.

...