Это сложный вопрос к слову ... так что несите меня.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
Является ли ItemID, PropertyID вашим основным ключом в таблице AssignedProperty? Это так, вы можете объяснить, почему вы удаляете и повторно вставляете точные записи? Исправить это просто: просто отправьте изменения два раза, после удаления и после повторной установки – Francisco
Ahh, если бы мне пришлось что-то забыть, это было бы так, lol. AssignedProperty имеет собственный первичный ключ, AssignedPropertyID, автоинкремент. Что касается элемента, пользователю разрешено делать столько изменений в объекте Item, сколько им нравится, и сохранять или отклонять изменения в любое время. Таким образом, приложение пытается справиться с этой ситуацией, так что все изменения могут быть представлены одновременно. В идеале пользователь, вероятно, не удалит AssignedProperty и снова сделает то же самое. Но это возможно. – instantmusic
Единственный способ, я думаю, это можно сделать, так это то, что ваше приложение обнаруживает, когда AssignedProperty удаляется, а затем повторно вставляется, чтобы он не удалял его в первую очередь. Я не думаю, что это хорошая идея, чтобы удалить ограничение из db, потому что рано или поздно данные могут быть повреждены. Я не знаю, как вы можете предсказать, как linq2sql обрабатывает все транзакции или принуждает порядок при этом, поэтому это может быть очень сложный подход. – Francisco