Я думаю, что это распространенная проблема, если вам нужно управлять синхронизацией БД в вашем приложении.
Настоящая проблема связана с Linq To Sql и с тем, как он создает операторы DELETE.
Итак, у вас есть два решения:
- переопределить стандартное поведение Linq To Sql DELETE (я этого не предлагаю): http://msdn.microsoft.com/en-us/library/bb882646.aspx
- используйте столбец ROWVERSION в вашей таблице (более доступный в качестве решения), который помогает Linq To Sql управлять крупными пакетными обновлениями / удалениями.
Я дам вам подробности о втором решении, гораздо более простом в реализации:
Если вы добавите в свою таблицу двоичный столбец с атрибутом IsVersion, установленным в значение true, например:
[Column(IsVersion = true)]
private Binary _version;
вы значительно улучшите производительность для пакетных УДАЛЕНИЙ и ОБНОВЛЕНИЙ.
НО, БУДЬТЕ ОСТОРОЖНЫ !!!
Если вы используете столбец ROWVERSION в таблице, вы должны удалить любой другой уникальный индекс, связанный с вашим первичным ключом, в противном случае ваше приложение будет аварийно завершено без каких-либо исключений !!
Поверьте мне, это будет очень раздражать !!
См. Этот пример:
[Table(Name = "_customers")]
[Index(Columns = "Uid", IsUnique = true)] // <- THIS WILL GIVE YOU AN UNEXPECTED CRASH!
[Index(Columns = "Code", IsUnique = true)]
public class Customer : BaseModel, IBaseTable
{
[Column(IsVersion = true)]
private Binary _version;
[Column(IsPrimaryKey = true, IsDbGenerated = false, DbType = "UNIQUEIDENTIFIER NOT NULL", CanBeNull = false)]
public Guid Uid {...}
...
}
Просто несколько самодельных статистик для моих таблиц (я знаю, что я не показываю вам схему, но поверьте мне: у меня есть все внешние ключи, которые вы можете себе представить, и это отлично работает!) ...
Клиенты -> от 34492 мс до 3230 мс (613 записей)
Продукты -> от 37233 мс до 7264 мс (416 записей)
Expiries -> от 3713 мс до 228 мс (2386 записей)
Единицы измерения продуктов -> от 66347 мс до 7321 мс (808 записей)