Можно ли работать с Entity получив из функции

Автор Тема: Можно ли работать с Entity получив из функции  (Прочитано 9417 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1184
  • Карма: 8
    • idea-soft.ru
  • Skype: makar_govorun
У меня есть функция, которая возвращает Entity по ObjectID
Вот такой код
Код - vb.net [Выбрать]
  1.     Public Shared Function acadnet_Entity_GetByID(ByVal ID As CAD_DBS.ObjectId, _
  2.                                                   ByVal db As CAD_DBS.Database) As CAD_DBS.Entity
  3.         Dim ent As CAD_DBS.Entity = Nothing
  4.         Using trans As CAD_DBS.Transaction = db.TransactionManager.StartTransaction
  5.             Try
  6.                 Dim dbObj = trans.GetObject(ID, CAD_DBS.OpenMode.ForRead, False, True)
  7.                 ent = DirectCast(dbObj, CAD_DBS.Entity)
  8.             Catch ex As System.Exception
  9.             End Try
  10.             trans.Commit()
  11.         End Using
  12.         Return ent
  13.     End Function

К примеру я буду использовать эту функцию в подпрограмме TEST
с условием, что полученный объект будет использоваться только для чтения
(мне нужно получать разные его поля в зависимости от типа примитива)
Вот так:

Код - vb.net [Выбрать]
  1.     Public Shared Sub TEST()
  2.         Dim id As CAD_DBS.ObjectId
  3.         Dim db As CAD_DBS.Database
  4.         '...
  5.         ' Инициализация id и db
  6.         '...
  7.         Dim getEnt As CAD_DBS.Entity = acadnet_Entity_GetByID(id, db)
  8.         If getEnt IsNot Nothing Then
  9.             ' объект getEnt буду использовать только для чтения данных его полей
  10.         End If
  11.     End Sub

У меня есть подозрение, что если программировать в таком стиле, то есть вероятность ошибок,
т.к. не контролирую состояние полученного объекта getEnt.
Я думаю, что лучше так не делать.
 
Хочу услышать мнения экспертов?
 
 




Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 735
  • Карма: 149
    • Мои плагины к Автокаду
Присоединяюсь к вопросу.
Я бы не стал закрывать транзакцию. Ее лучше открыть и коммитить уровнем выше. Тогда точно проблем не будет. Ну или создать клон объекта. Клон не привязан ни к БД, ни к транзакции - храните сколько хотите.
А в вашем коде trans.Commit наверно вызовет Entity.Dispose. Так?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 735
  • Карма: 149
    • Мои плагины к Автокаду
И еще в вашем случае незачем передавать в функцию db. У ObjectId и так есть Database. А у Datebase есть TransactionManager.TopTransaction. Так что хратит одного параметра ObjectId.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Это называется работой через зад (ИМХО). Время жизни об'екта, полученного через транзакцию, регулируется этой транзакций. Транзакции нужно корректно завершать, дабы освобождать ресурсы. Иначе ты будешь ловить тотал эрроры.

У меня в блоге есть инфа по работе с транзакцией и без.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13072
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
А в вашем коде trans.Commit наверно вызовет Entity.Dispose. Так?
А Entity.Dispose в свою очередь вызовет Entity.Close и ent станет неопределённой. Так что рубить сук, на котором сидишь, не советую.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1184
  • Карма: 8
    • idea-soft.ru
  • Skype: makar_govorun
Ребята! Спасибо большое за ответы.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1184
  • Карма: 8
    • idea-soft.ru
  • Skype: makar_govorun
как удалить этот пустой ответ?

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1184
  • Карма: 8
    • idea-soft.ru
  • Skype: makar_govorun
Клон не привязан ни к БД,
Да о клоне. (Entity.Clone)
Я попробовал сделать клона для Entity и действительно можно получать информацию из полей клона, но не всю.

Такие поля как Handle ObjectID у клона = 0.
Ну это и понятно. т.к. клон он же не привязан к БД.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 735
  • Карма: 149
    • Мои плагины к Автокаду
да у клона есть некоторые ограничения. Как и у нового объекта. Например не сработает FullSubEntityPath у солидов. Но есть и куча достоинств - можно безболезненно и безопасно делать с ним все что душе угодно: например подвинуть, повернуть, чтоб легче было обмерить, сравнить с другими объектами. И никаких фаталов, даже если нечаянно забыть Dispose().
ObjectId (вместе с Handle) придется сохранять отдельно.
Вообще, если придерживаться принципа "Один CommandMethod - одна транзакция" (т.е. открывать транзакцию сразу в начале обработчика команды и закрывать в самом конце, и во все функции передавать ЭТУ же транзакцию через TopTransaction или через параметр функции), то тогда таких проблем вообще возникнуть не должно.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Чем меньше зависимостей, тем надёжней код. Самый надёжный способ (имхо) - передавать методу в качестве параметра ObjectId, без каких-либо транзакций и прочей шелухи.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 735
  • Карма: 149
    • Мои плагины к Автокаду
Насчет зависимостей - да, конечно. Но про транзакцию - нееее! Тут, как обычно надо баланс соблюдать. Открывать новую транзакцию (если она вообще нужна) по каждому чиху, в каждой процедурке из 3х строк? А если процедурка эта будет вызываться в цикле по всех БД чертежа? Это ж катастрофа. Да и суть транзакции, что б сделать откат всего CommandMethod. А если коммитить на каждом шагу весь смысл теряется. (тоже ИМХО)

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Открывать новую транзакцию (если она вообще нужна) по каждому чиху, в каждой процедурке из 3х строк? А если процедурка эта будет вызываться в цикле по всех БД чертежа? Это ж катастрофа.
А ты пробовал реально замерять разницу в скорости?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 735
  • Карма: 149
    • Мои плагины к Автокаду
Не-а  ::) Верю знатокам на слово  :D А что, не тормозит на самом деле? Попробовать что ли....

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Не-а  ::) Верю знатокам на слово  :D А что, не тормозит на самом деле? Попробовать что ли....
Мой вопрос был без подвоха. Попробуй, конкретно это я не замерял (измерял др. вещи). Вряд ли падение производительности будет существенным, тем более, что в реальности код твоего метода вряд ли будет состоять из "трёх строчек". Кроме того, получить объект и работать с ним можно в т.ч. и без транзакции. Что быстрее в той или иной ситуации - это нужно замерять на конкретных примерах.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Сервер тупит. Александр Наумович, удалите продублированное сообщение. Регулярно получаю сообщения о том, что сервер вышел покурить...