LINQ to SQL.Каскадное удаление суммирования - PullRequest
4 голосов
/ 04 июля 2010

У меня есть отношение «многие ко многим» между людьми и адресами

Person { Id, ... }
Address { Id, ... }
Address2Person { Id, PersonId, AddressId }

Классы, сгенерированные DBML (на диаграмме есть PK и FK):

class Person {
  Id, Address2Person 
}

class Address2Person {
  Id, Person, PersonId, Address, AddressId
}

class Address {
  Id, Address2Person
}

КогдаЯ удаляю человека, которому нужно удалить строки AddressPerson (и это легко), а также соответствующие строки адреса, но только когда нет внешних ссылок на адрес, кроме той, которая удаляется.

Может быть, было бы разумнеереализовать каскадное удаление на уровне БД, но как я могу эмулировать это в чистом LINQ 2 SQL?

Наконец-то я написал что-то вроде этого:

// finding out addresses to delete
var addressesToDelete = 
  (from ap in DataBase.Address2Person
    group ap by ap.Address
    into g
      where g.All(x => x.PersonId == personId2Delete)
        select g.Key).ToList();

// killing references
DataBase.Address2Person.DeleteAllOnSubmit(
    DataBase.Address2Person.Where(x => x.PersonId == personId2Delete));

// killing addresses
DataBase.Address.DeleteAllOnSubmit(addressesToDelete);

Есть ли лучший способ?

Заранее спасибо!

1 Ответ

3 голосов
/ 06 августа 2010

Если ваше правило состоит в том, что вы не можете иметь потерянные адреса, вы можете получить более высокую производительность и упростить обслуживание кода из следующей последовательности:

DataBase.Address2Person.DeleteAllOnSubmit(
    DataBase.Address2Person.Where(x => x.PersonId == personId2Delete));
DataBase.Address.DeleteAllOnSubmit(
    DataBase.Address.Where(x => !x.Address2Person.Any());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...