Выполняет ли Linq-SQL вызов submitchanges() без изменений для отправки — что-нибудь делать?

#linq-to-sql

#linq-to-sql

Вопрос:

У меня есть несколько обновлений таблиц базы данных, которые могут произойти, а могут и не произойти. Вместо того, чтобы вызывать submitchanges() несколько раз, я бы предпочел вызвать один раз.

Потенциально не будет никаких изменений для отправки в базу данных.

Мой вопрос в том, действительно ли Linq что-то делает в этом сценарии? или достаточно ли он умен, чтобы знать, что обновление не требуется, и ничего не происходит — следовательно, никаких накладных расходов.

Спасибо за ваш совет.

             if (setTempResult)
            {                    
                tr = new tempResult();
                db.tempResults.InsertOnSubmit(tr);
                tr.userId = tl.us.userId;
                tr.result = serializer.Serialize(tl.responseList);
                tr.resultTime = DateTime.Now;                    
            }

            if (string.IsNullOrEmpty(tl.actionCategory))
            {
                action ac = new action();
                ac.userId = tl.us.userId;
                ac.operation = "STR";                    
                db.actions.InsertOnSubmit(ac);
            }
            db.SubmitChanges();
  

Ответ №1:

После просмотра кода для Linq-to-SQL в .NET 4.5 выясняется, что это зависит от того, находится ли ваш код в транзакции или нет. Псевдокод:

 public void SubmitChanges()
{
    if (inTransaction)
    {
        try
        {
            // Verify the connection is open, if it is the "clear" it
            // Begin a transaction
            // Send changes, if any
            // Commit transaction
        }
        catch
        {
            // Rollback transaction
        }
        finally
        {
            // Close the connection, if it was opened above
        }
    }
    else
    {
        // Send changes, if any
    }
}
  

Как вы можете видеть, будут накладные расходы на открытие / закрытие / очистку соединения и начало / фиксацию транзакции, если она еще не заключена в явную транзакцию.

Ответ №2:

В зависимости от вашего бэкэнда, он должен иметь возможность определять, были ли внесены изменения. Например, Entity Framework использует так называемые состояния объекта в своем DbContext и прикрепленных объектах.

Вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-us/library/bb386982 (v = против 110).aspx