2010-09-27 6 views
0

Это сложный вопрос к слову ... так что несите меня.MS SQL Server 2008 Check Constraint и LINQ-To-SQL

У меня есть две таблицы в моей базе данных, [Item] и [AssignedProperty]. [AssignedProperty] - ребенок в отношениях родитель-ребенок с [Item]. Таким образом, в основном это имеет поле ItemID и отношение внешнего ключа, использующее его. [AssignedProperty] также имеет идентичную связь с другой таблицей с именем [Property] и собственным первичным ключом AssignedPropertyID. Это создает хорошие отношения «многие ко многим». Однако у меня есть ограничение, которое диктует, что один [AssignedProperty] не может иметь повторяющиеся вхождения ItemID и PropertyID в той же записи. Поэтому [Item] может иметь только один из [Property].

Это работает хорошо, но с LINQ-To-SQL, проблема в том, что я считаю порядком выполнения, который конфликтует с этим ограничением.

Чтобы произвести эту ошибку, я загружаю [Item] в мое приложение, используя LINQ-To-SQL. Затем я выбираю объект [AssignedProperty], из коллекции [AssignedProperties] и удаляю его. Затем я создаю новый объект [AssignedProperty] с тем же ItemID и PropertyID, что и тот, который я только что удалил, и добавьте его обратно в коллекцию. Когда я вызываю [SubmitChanges] в DataContext, он будет отмечать меня по ограничению. Если сначала была удалена старая запись [AssignedProperty], тогда нет причины, по которой новая должна произвести эту ошибку. Похоже, что он пытается вставить новый [AssignedProperty] перед удалением старого.

Как это исправить, а также в базе данных или в моем приложении? TIA

+0

Является ли ItemID, PropertyID вашим основным ключом в таблице AssignedProperty? Это так, вы можете объяснить, почему вы удаляете и повторно вставляете точные записи? Исправить это просто: просто отправьте изменения два раза, после удаления и после повторной установки – Francisco

+0

Ahh, если бы мне пришлось что-то забыть, это было бы так, lol. AssignedProperty имеет собственный первичный ключ, AssignedPropertyID, автоинкремент. Что касается элемента, пользователю разрешено делать столько изменений в объекте Item, сколько им нравится, и сохранять или отклонять изменения в любое время. Таким образом, приложение пытается справиться с этой ситуацией, так что все изменения могут быть представлены одновременно. В идеале пользователь, вероятно, не удалит AssignedProperty и снова сделает то же самое. Но это возможно. – instantmusic

+0

Единственный способ, я думаю, это можно сделать, так это то, что ваше приложение обнаруживает, когда AssignedProperty удаляется, а затем повторно вставляется, чтобы он не удалял его в первую очередь. Я не думаю, что это хорошая идея, чтобы удалить ограничение из db, потому что рано или поздно данные могут быть повреждены. Я не знаю, как вы можете предсказать, как linq2sql обрабатывает все транзакции или принуждает порядок при этом, поэтому это может быть очень сложный подход. – Francisco

ответ

0

94% прослушивает меня, и на самом деле ответ на комментарии к исходному сообщению.

Итак, это просто так, что я могу на самом деле выбрать ответ.