Приоритет SQL-запросов в контексте Linq-2-SQL - PullRequest
1 голос
/ 12 июля 2011

У меня есть таблица, которая содержит пары Key (LocumID) - Value (AvailableDate). У таблицы есть свой учебник для начинающих. Ключ / значение не может быть повторен, поэтому я добавил уникальное составное ограничение для LocumID & AvailableDate.

OID                  LocumID              AvailableDate           AvailabilityStatusID 
-------------------- -------------------- ----------------------- -------------------- 
1                    1                    2009-03-02 00:00:00     1                    
2                    2                    2009-03-04 00:00:00     1                    
3                    1                    2009-03-05 00:00:00     1                    
4                    1                    2009-03-06 00:00:00     1                    
5                    2                    2009-03-07 00:00:00     1                    
6                    7                    2009-03-09 00:00:00     1                    
7                    1                    2009-03-11 00:00:00     1                    
8                    1                    2009-03-12 00:00:00     2                    
9                    1                    2009-03-14 00:00:00     1                    
10                   1                    2009-03-16 00:00:00     1                    

Теперь, при реальном использовании, я считаю, что лучшим решением будет просто исключить старые значения для пары LocumID-AvailableDate и вставить новое. Однако в Linq-to-SQL я в конце вызываю DbContext.SubmitChanges(), и именно здесь SQL Server выдает исключение, сообщающее, что инструкция конфликтует с ограничением.

Теперь, если я проверю свои строки кода, я сначала удаляю уже существующую пару, создаю новую и вставляю ее. Почему в этой транзакции нарушается ограничение?

Кроме того, если я сначала удаляю ранее существующую пару, то SubmitChanges, а затем приступаю к созданию новой, вставляю ее, и SubmitChanges ... все хорошо.

Однако я теряю преимущество полной транзакции.

Есть идеи? Привет.

1 Ответ

2 голосов
/ 12 июля 2011

SubmitChanges не гарантирует выполнение вызовов в этом порядке. Однако вместо того, чтобы полагаться на linq to sql для выполнения транзакции, просто сделайте ее самостоятельно:

using(TransactionScope scope = new TransactionScope())
{
  //first call
  context.SubmitChanges();

  //other work
  context.SubmitChanges();
}

linq to sql сначала проверит, находит ли транзакцию, прежде чем совершать ее самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...