А в вашем коде trans.Commit наверно вызовет Entity.Dispose. Так?А Entity.Dispose в свою очередь вызовет Entity.Close и ent станет неопределённой. Так что рубить сук, на котором сидишь, не советую.
Клон не привязан ни к БД,Да о клоне. (Entity.Clone)
Открывать новую транзакцию (если она вообще нужна) по каждому чиху, в каждой процедурке из 3х строк? А если процедурка эта будет вызываться в цикле по всех БД чертежа? Это ж катастрофа.А ты пробовал реально замерять разницу в скорости?
Не-а ::) Верю знатокам на слово :D А что, не тормозит на самом деле? Попробовать что ли....Мой вопрос был без подвоха. Попробуй, конкретно это я не замерял (измерял др. вещи). Вряд ли падение производительности будет существенным, тем более, что в реальности код твоего метода вряд ли будет состоять из "трёх строчек". Кроме того, получить объект и работать с ним можно в т.ч. и без транзакции. Что быстрее в той или иной ситуации - это нужно замерять на конкретных примерах.
вполне себе полезная функциональность в 3 строкиА без транзакций? Кроме того, не видя твоего кода сложно судить о том, насколько оптимально ты выполняешь те или иные операции.
А без транзакций я не умею. У меня ObjectId.GetObject выдает невнятный эксцепшнhttp://bushman-andrey.blogspot.ru/2013/01/database-autocad.html
Document doc = AcadApp.DocumentManager.MdiActiveDocument;Зачем? Есть же id.Database
using (Transaction tr = doc.Database
Есть же id.DatabaseЛогично, кэп!
Хотя где-то я точно видел, что использует народ именно ObjectId.GetObject... Не сам же я такое придумалЭто как раз, чтобы транзакцию не передавать во вспомогательные методы. Смотрите видео, в общем. Неохота по 100 раз одно и то же повторять :)
Неохота по 100 раз одно и то же повторятьСамое обидное, что я это знал, читал, но напроч забыл, т.к. ни разу не использовал. Ну не удержать все в голове, извиняйте...
А без транзакций я не умею. У меня ObjectId.GetObject выдает невнятный эксцепшнЭто тоже самое, что с транзакцией, но используется TopTransaction. Если ни одна транзакция не запущена - то само-собой возникнет исключение.
Меня слегка напрягает, что Open помечен 'ObjectId.Open(OpenMode)" является устаревшим: 'For advanced use only. Use GetObject instead'. Есть же какая-то причина, что его так пометилиРазницу между устаревшим и "For advanced use only" чувствуешь? Если на каждый Open не будет Close - гарантированный Fatal Error. Поэтому в большистве случаев используется конструкция типа
Если на каждый Open не будет Close - гарантированный Fatal Error.Помимо этого, есть еще 2 проблемы, которые могут возникнуть при использовании Open:
1. Если объект ранее был открыт на запись, или на чтение 255 раз - исключение. Вы как-то сами мне это подсказали ;). Вот как проверить это перед открытием объекта?Если использовать using, то никогда в такую ситуацию не попадёшь. Разве что сделаешь 255 вложенных using с одним и тем же ObjectId.
2. А что будет в Вашем примере, если открытый объект не удастся привести к Entity? Объект откроется, но не закроется, как я понимаю.Нужно конечно проверить, но думаю что всё будет нормально, так как ObjectId.Open возвращает DBObject, а он тоже в конечном итоге происходит от DisposableWrapper. Соответственно вызовется его метод Dispose, соторый равносилен Close. Так что всё будет нормально.
Если использовать using, то никогда в такую ситуацию не попадёшь.Не поверите, уже столкнулся. Происходит обращение к объекту, который был открыт на редактирование то ли самим автокадом, то ли другим методом.
Нужно конечно проверить, но думаю что всё будет нормальноКак я понимаю, Ваш код эквивалентен этому:
Не поверите, уже столкнулся. Происходит обращение к объекту, который был открыт на редактирование то ли самим автокадом, то ли другим методом.Теоретически возможно. Но тут речь не про 255 "на чтение" с дополнительной попыткой открыть "на чтение", а открытый "на запись" и вторая попытка открытия. А это согласись разные вещи.
Как я понимаю, Ваш код эквивалентен этому:А я думаю, что не эквивалентен. Тут или очень хорошо знать теорию, или экспериментировать.
Но тут речь не про 255 "на чтение" с дополнительной попыткой открыть "на чтение", а открытый "на запись" и вторая попытка открытия. А это согласись разные вещи.Да я согласен, конечно :) Я же не с целью поспорить, а просто хочу предупредить о возможной опасности.
Тут или очень хорошо знать теорию, или экспериментировать.Проверил вот таким кодом, в 19 строке исключение, что объект открыт на запись: