#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