Это одна из тех ситуаций, с которыми мы часто сталкиваемся в программировании.Technology_A не позволит мне выполнить Operation_B, но так и должно быть!Затем, после того как мы некоторое время бьем головой о стену, мы сдаемся (или идем в Stackoverflow).Мы делаем это, потому что мы не используем технологию, как было задумано (это нормально, вот как мы учимся!)
Проблема здесь в схеме вашей базы данных.
Вы пытаетесь сделать слишком много за одним столом.Вы не должны хранить билеты (где один и тот же билет может существовать более одного раза) в той же таблице, в которой вы отслеживаете # случаев.
По моему мнению, есть две хорошие стратегии для исправления этой ситуации.Во-первых, я бы создал таблицу заявок с первичным ключом из одного столбца.Затем я создал бы таблицу, в которой хранится каждый экземпляр заявки.
Пример: Ticket43 закрыт, но снова открыт и снова закрыт.Это означает (если я правильно прочитал ваш вопрос), что у билета было два экземпляра.Это означает, что в исходной таблице будет две записи, но в моей новой предлагаемой схеме будет одна запись в Tickets и две записи в Ticket_Instances.
Примечание. Вы обязательно захотите сохранить тикетинформация, которая никогда не меняется между экземплярами в Tickets и специфическая для экземпляра информация Ticket в Ticket_Instances.
Чтобы записать количество билетов , первое, что я хотел бы сделать, это просто написать представление или бит SQLнапример:
SELECT
count(*) as TicketCount,
TicketID
FROM
Ticket_Instances as TI
GROUP BY
TicketID
Если вы не хотите рассчитывать это по требованию , тогда я предлагаю использовать:
- ASP.NET Cache (Запустите приведенный выше SQL, закройте его в кеш с TTL 10 минут)
- Используйте таблицу Ticket_Counts, которая заполнена триггером
Я подозреваю, что вы предпочтете вариант2 там (хотя я бы использовал вариант 1).
Метод триггера:
Предполагая, что Ticket_Instances никогда не могут быть удалены, вам нужен только триггер вставки.Вы должны создать триггер в таблице Ticket_Instances после вставки, и этот триггер SQL будет делать следующее:
- Если TicketID не существует в Ticket_Counts, тогда вставьте TicketID в Ticket_Counts с TicketCount 0
- Затем увеличьте TicketCount на 1 от идентификатора TicketID в Ticket_Counts
. С помощью этого метода вам нужно только получить доступ к Ticket_Counts по TicketID, чтобы получить # вхождений этого конкретного Ticket.
Я думаю, вы обнаружите, что ваши ошибки ограничения исчезают после обновления схемы.