Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Не удаляется автоматически список подчинённых сущностей в Entity framework.  [new]
rigorMortis
Member

Откуда:
Сообщений: 283
Привет

Есть таблица Dealers и есть дочерняя ей таблица Phones.

    public partial class Dealers
    {
        public int ID { get; set; }
        public virtual ICollection<Phones> Phones { get; set; }//связь с подчинённой таблицей
    }



Удаляю Dealers так:

     context.Dealers.Remove(item);
     context.SaveChanges();


выбрасывается исключение:

Конфликт инструкции DELETE с ограничением REFERENCE "FK_Phone_Dealers".
Конфликт произошел в базе данных "dev", таблица "dbo.Phones", column 'Dealers_ID'.
Выполнение данной инструкции было прервано.


Если предварительно удалить все phones для этого Dealer

            
List<Phones> phones = context.Phones.Where(i => i.Dealers_ID == item.ID).ToList();
            foreach (Phones phone in phones)
                context.Phones.Remove(phone);


Понятно, что пока существуют дочерние записи в Phones, родительскую таблицу Dealers удалять нельзя. Но разве фрэймворк не должен был сделать это автоматом перед удалением Dealers.
10 окт 14, 19:59    [16689220]     Ответить | Цитировать Сообщить модератору
 Re: Не удаляется автоматически список подчинённых сущностей в Entity framework.  [new]
Lelouch
Member

Откуда: Москва
Сообщений: 1879
rigorMortis,

для этого нужно явно указать, что необходимо каскадное удаление. Например с помощью http://msdn.microsoft.com/ru-ru/library/gg696319(v=vs.113).aspx
10 окт 14, 20:13    [16689273]     Ответить | Цитировать Сообщить модератору
 Re: Не удаляется автоматически список подчинённых сущностей в Entity framework.  [new]
rigorMortis
Member

Откуда:
Сообщений: 283
А можно ли как-то найти и удалить дочерние сущности объекта, тип которого неизвестен, но известно что это сущность EF?
То есть в метод передаётся обобщённый тип Т:

void DeleteChilds(T obj)
{

}

Здесь нам известен контекст - глобально, obj - сущность, представляющая родительскую таблицу, нужно найти и удалить её дочерние сущности-таблицы.
12 окт 14, 01:25    [16692435]     Ответить | Цитировать Сообщить модератору
 Re: Не удаляется автоматически список подчинённых сущностей в Entity framework.  [new]
rigorMortis
Member

Откуда:
Сообщений: 283
Вобщем, вот, работает:

        public void DeleteWithChild<T>(T parent) where T : class
        {
            using (TransactionScope tran = new TransactionScope())
            {
                try
                {
                    DeleteChild(parent);//delete all related child entityes
                    _db.Set<T>().Remove(parent);//delete parent entity
                    _db.SaveChanges();
                    tran.Complete();
                }
                catch 
                {
                    throw new Exception("DB error");
                }
            }
        }
        public void DeleteChild<T>(T entity) where T : class
        {
            foreach (PropertyInfo property in entity.GetType().GetProperties())//проходим по всем свойствам объекта
                if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType) && property.PropertyType != typeof(string))// если коллекция
                {
                    Type genericType = property.PropertyType.GetGenericArguments()[0];//получаем то что у неё в угловых скобках
                    object propertyValue = property.GetValue(entity, null);//получаем саму коллекцию
                    _db.Set(genericType).RemoveRange((IEnumerable)propertyValue);//удаляем разом всю коллекцию из контекста
                }
        }
13 окт 14, 00:25    [16694648]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить