Can you create a Block named 'LayoutTarget' then try it and see if you are somehow returning a incorrect ObjectId in CreateLayoutTarget() method?
I can not recreate error it in 2012
[CommandMethod("AddBlockReference")]
public void AddBlockReference()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
using (Transaction trx = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trx.GetObject(db.BlockTableId, OpenMode.ForRead, false);
ObjectId targetId = ObjectId.Null;
if (!bt.Has("LayoutTarget"))
targetId = CreateLayoutTarget(); // Create BlockTableRecord
else
targetId = bt["LayoutTarget"];
BlockReference bref = new BlockReference(Point3d.Origin, targetId);
bref.Layer = "0";
BlockTableRecord modelBtr = (BlockTableRecord)trx.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
ObjectId brefId = modelBtr.AppendEntity(bref);
trx.AddNewlyCreatedDBObject(bref, true);
BlockTableRecord btr = (BlockTableRecord)trx.GetObject(targetId, OpenMode.ForRead); //<--- eErased Exception!
foreach (ObjectId id in btr)
{
ed.WriteMessage("\n" + id.ObjectClass.Name);
}
trx.Commit();
}
}
public ObjectId CreateLayoutTarget()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
using (Transaction trx = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trx.GetObject(db.BlockTableId, OpenMode.ForWrite, false);
BlockTableRecord newBtr = new BlockTableRecord();
newBtr.Name = "LayoutTarget";
ObjectId id = bt.Add(newBtr);
trx.AddNewlyCreatedDBObject(newBtr, true);
Circle c = new Circle(Point3d.Origin, Vector3d.ZAxis, 10);
newBtr.AppendEntity(c);
trx.AddNewlyCreatedDBObject(c, true);
trx.Commit();
return id;
}
}