2010-07-03 3 views
4

У меня есть много-ко-многим между лицами и адресамиLINQ to SQL. Каскад удалить sumulation

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

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

Спасибо заранее!

ответ

3

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

DataBase.Address2Person.DeleteAllOnSubmit(
    DataBase.Address2Person.Where(x => x.PersonId == personId2Delete)); 
DataBase.Address.DeleteAllOnSubmit(
    DataBase.Address.Where(x => !x.Address2Person.Any()); 
+0

Спасибо за ответ, я буду проверять в течение нескольких дней! –