2016-07-06 15 views
1

erhalten wurden Ich schreibe ein AutoCAD-Plugin. Ich benutze eine Transaktion, um einige Objekte zu bekommen, und ich habe eine Frage gestellt - muss ich Objekte (die ich über die Transaktion erhalten habe) schließen?Schließen AutoCAD-Objekte, die über die Transaktion

Es ist in der Dokumentation geschrieben, dass, wenn die Commit() - Methode Transaktion aufgerufen wird, jedes Objekt schließt, das über die Transaktion empfangen wurde.

Leere Commit() - Diese Funktion verpflichtet die vorgenommenen Änderungen in allen DBObjects während der Transaktion geöffnet, und dann schließt sie.

Aber was passiert, wenn ich diese Methode nicht nenne? Zum Beispiel verwende ich die Transaktion nur, um ein Objekt zu öffnen und seinen Ebenennamen zu erhalten. So etwas wie das Folgende:

Wie Sie sehen können, ich hier nicht Commit() aufrufen. Was wird in diesem Fall passieren? Wird die Entität geschlossen oder nicht (wie die Transaktion es verwendet, muss sie entsorgt werden, also nehme ich an, dass sie alle Objekte schließen muss. Aber ich habe keine Bestätigung in der Dokumentation gefunden, so dass es nur meine Annahme ist).

Vielleicht brauche ich, wie dies zu tun:

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; 
     } 
    } 

Links zu offiziellen Quellen gefördert werden.

Vielen Dank.

+0

Normalerweise müssen Sie nicht jede Entität entsorgen. Wenn "entity" im zweiten Fall "null" ist, erhalten Sie "Exception", wenn "entity.Dispose" aufgerufen wird. –

+0

@SarveshMishra nein, werde ich nicht. Ich habe diesen Code ausgeführt und selbst wenn die Entity null ist - ich werde keine Ausnahme bekommen. –

Antwort

2

Ich erinnere mich an einen Beitrag von Kean Walmsley gelesen, wo er erwähnt, dass wenn Sie nicht verwenden Commit() eine Transaktion wird immer Abort() standardmäßig verwenden (ich werde es nachschlagen).

Entitäten werden automatisch entsorgt, wenn sie in einer Transaktion verwendet werden. Kean hat einige schöne Beispiele in seinem Blog. Sie sollten sie auf jeden Fall überprüfen. Sie können sie finden here

Sie erhalten auch Benachrichtigungen in Ihrem Compiler-Ausgang, wenn Entitäten entsorgt werden müssen.

EDIT:

vergessend, eine Transaktion zu begehen

[...] Eine nicht gebundenen Transaktion abgebrochen wird, wenn es angebracht ist, so jeder Sie an der Datenbank ändern, in der Transaktion gerollt zurück [...]

Es auf adndevblog von Stephen Preston geschrieben wurde here

+0

Vielen Dank für Ihre Antwort. Wie ich verstanden habe, muss ich keine Objekte entsorgen, die durch eine Transaktion geöffnet wurden, weil sie durch eine Transaktion entsorgt werden. Habe ich recht? –

+0

Ja. Indem Sie Ihre Transaktion abwickeln, kümmert sie sich um Ihre Entitäten darin. –