Лучший способ обработки уникальных ограничений при использовании Entity Framework

Я использую Entity Framework 4.0 для доступа к данным в таблице с уникальным ограничением столбца. Если ограничение нарушается, возникает исключение, когда я вызываю SaveChanges(), как и ожидалось. Мой вопрос заключается в том, должен ли я разрешить исключение в первую очередь. В качестве альтернативы я мог бы сделать выбор, чтобы избежать вставки повторяющихся данных (я предполагаю, что транзакция будет необходима).

Какова общепринятая передовая практика в этом сценарии?


person Andy West    schedule 31.10.2010    source источник


Ответы (1)


Как правило, хорошей идеей является предотвращение исключения, поскольку создание исключения является довольно сложной операцией, требующей больших затрат времени и ресурсов. Поэтому, если вы можете легко проверить, существует ли уже уникальное значение ключа, я бы, вероятно, так и сделал. Предполагая, что у вас есть уникальный индекс или уникальное ограничение для этого столбца на уровне базы данных, тогда (по крайней мере, для SQL Server) уже есть индекс для этого столбца, поэтому проверка определенного значения будет довольно простой и не будет иметь огромной производительности. влияние.

Другой вопрос: как часто, по вашему мнению, это будет происходить? Один раз в день? Раз в пару недель? Несколько раз в минуту? Если это происходит довольно редко - один раз в голубую луну - я бы не стал пытаться сначала проверить - в этом случае просто позвольте исключению произойти и обработайте его.

Так что я думаю, что это действительно вопрос того, насколько дорого стоит сначала проверить и как часто это происходит? Если вы можете это очень легко проверить --> обязательно сделайте это! Но если это довольно сложная операция для проверки, и это происходит очень редко, то просто обработайте исключение.

person marc_s    schedule 31.10.2010
comment
Спасибо за здравый смысл; это примерно то, о чем я думал. Поскольку нарушения ограничений в этом случае случаются редко, я оставлю все как есть. - person Andy West; 31.10.2010
comment
Хм... не могу согласиться. Создание исключения не так дорого, как запрос к базе данных. Тем не менее, вы должны запросить базу данных перед операцией вставки/обновления, что может привести к нарушению ограничения уникальности. - person CodeMonkeyKing; 10.03.2011
comment
@CodeMonkeyKing В том-то и дело. Если вы запрашиваете базу данных перед вставкой, у вас ВСЕГДА будут дополнительные штрафы за круговые поездки, и даже в этом случае вставка может произойти между вашими запросами и сделать первый запрос недействительным. Как сказал Марк, проверьте, редки ли исключения такого типа в вашей системе, и если да, просто позвольте базе данных обработать их. - person andrecarlucci; 14.02.2012