2016-07-06 2 views
1

Я пишу плагин AutoCAD. Я использую транзакцию для получения некоторых объектов, и у меня возник вопрос: мне нужно закрыть объекты (объекты), которые я получил через транзакцию?Закрытие объектов AutoCAD, которые были получены по транзакции

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

void Commit() - Эта функция выполняет изменения, сделанные во всех DBO-объектах, открытых во время транзакции, а затем закрывает их.

Но что происходит, когда я не называю этот метод? Например, я использую транзакцию только для открытия объекта и получения его имени слоя. Что-то вроде следующего:

Database hostapp_workdb = HostApplicationServices.WorkingDatabase; 
    using (Application.DocumentManager.MdiActiveDocument.LockDocument()) 
    using (Transaction transaction = hostapp_workdb.TransactionManager.StartTransaction()) 
    { 
     Entity entity = transaction.GetObject(objectId, OpenMode.ForRead) as Entity; 

     if (entity != null) 
      layer = entity.Layer; 
    } 

Как вы можете видеть, здесь я не называю Commit(). Что будет в этом случае? Будет ли объект закрыт или нет (поскольку транзакция используется, он должен быть удален, поэтому я предполагаю, что он должен закрыть все объекты, но я не нашел подтверждения в документации, так что это только мое предположение).

Может быть, мне нужно сделать так:

ObjectId objectId = new ObjectId(); 
    string layer = string.Empty; 

    Database hostapp_workdb = HostApplicationServices.WorkingDatabase; 
    using (Application.DocumentManager.MdiActiveDocument.LockDocument()) 
    using (Transaction transaction = hostapp_workdb.TransactionManager.StartTransaction()) 
    { 
     using (Entity entity = transaction.GetObject(objectId, OpenMode.ForRead) as Entity) 
     { 
      if (entity != null) 
       layer = entity.Layer; 
     } 
    } 

Ссылки на официальные источники поощряются.

спасибо.

+0

Обычно вам не нужно распоряжаться каждым объектом. В вашем втором случае, если «entity» является «null», вы получите «Exception», когда вызывается «entity.Dispose». –

+0

@ Сэрвеш Мишра нет, не буду. Я запустил этот код и даже если объект равен null - я не получу никакого исключения. –

ответ

2

Я помню, как прочитал сообщение Кина Уолмсли, где он упомянул, что если вы не используете Commit(), транзакция всегда будет использовать Abort() для каждого по умолчанию (я буду искать его).

Объекты будут автоматически удалены, если они используются в транзакции. У Кина есть несколько приятных примеров в его блоге. Вы должны обязательно проверить их. Вы можете найти их here

Вы также получаете уведомления в своем компиляторе, если объекты должны быть удалены.

EDIT:

Забыв транзакцию

[...] несовершенное транзакция прерывается, когда он удалялись, так каждого изменения внесены в базу данных в транзакции прокатывают назад [...]

Он был размещен на adndevblog Стивен Престон here

+0

Благодарим вас за ответ. Насколько я понял, мне не нужно распоряжаться объектами, открытыми транзакцией, потому что они будут удалены транзакцией. Я прав? –

+0

Да. Утилизируя свою транзакцию, она заботится о ваших сущностях внутри нее. –

Смежные вопросы