My project is ArcGis extension, which uses a specific set of tables and feature classes. I want that this structure to behave like single geodatabase object, so user cannot delete part of it's schema. In ArcGis this functionality is present in Cadastral Fabric. It contains several feature classes and tables that are not visible to user. This is clearly seen in "New Relationship Class dialog".

What ArcObjects interfaces/Workspace extensions do I need to implement to achive such behavior? enter image description here


In the current project we are working we have several classes/interfaces implemented to come together as a solution.

We the following tasks using the these classes:

  • Validation/Cascading Behavior (Class Extension);
  • IWorkspaceExtension for hiding internals;
  • ArcMap Extensions (capture of certain events that allow or disallow user to continue with such operation);
  • Edit Tasks for complex create operations;
  • A in-memory cache, synced via class extension (this is used to reduced the round-trips to database when cascading updates)

We mostly handle relationships with subsequent queries, instead of using relationship classes, althought they are present in the schema.

The maximum distance we could go here is to have most of the default behavior on each feature class, ´but enforcing our business rules. We could go and create such datatype as cadastral networks, the effort would not pay off: http://edndoc.esri.com/arcobjects/8.3/?URL=/ArcObjectsOnline/Samples/ArcMap/Layers/DatabaseLayers/DatabaseLayers.htm

| improve this answer | |
  • George, thank you for such great sample! It is a good idea to implement custom GxObject. This covers almost all my needs, except providing the way for creating this objects in arccatalog through new menu. Is there any sample for such thing? – megadrofan Nov 14 '11 at 7:44

You can hide specific tables and/or relationship classes by implementing a workspace extension. More specifically, this is achiveved by implementing IWorkspaceExtension.PrivateDatasetNames and IWorkspaceExtension.DataDictionaryTableNames. Also be sure to thoroughly read the conceptual workspace extensions overview.

However, mimicking further behavior of Cadastral Fabric is not easily done since you cannot implement a new kind of dataset. If you look at the esriDatasetType enum, you'll see these are baked directly into ArcGIS. There are no extensibility points to provide equivalent implementations.

Your best bet is to hide your solution-specific datasets and provide set of tools (ArcMap, ArcCatalog) which act on them.

| improve this answer | |
  • this is the strategy I use when needed. works pretty well, but your development effort is big. – George Silva Nov 9 '11 at 13:11

That is going to be a pretty big task to take on; you are looking at having to write your own interfaces into the Geodatabase for your storage; but then also into the Geometry to define your Feature that will have all the relationship information and will maintain all the integrity of the information.

As you see in most of the Enterprise DBs that ESRI uses; none of them rely on DB relationships or dependencies; this makes it easier to abstract out and have a general DB Access layer, so they handle all the referential integrity in there own code (like the Cadastral/Parcel Framework).

You may be able to create your own geometry using overrides or clones from the ESRI API; but either way you go; this is not going to be a small task since you are going to be creating your own ESRI geometry objects(that will inherit from core objects) that you then control in your code.

I was just thumbing through the core API docs for .Net and there isn't even any sample code I could pick out that would give you a good starting point.

| improve this answer | |
  • I thought that I could achive this by writing class and workspace extensions that implement standard ESRI geodatabase interafces. But I do not know wich of them shold I use. – megadrofan Nov 8 '11 at 6:48
  • No, its not going to be quite that easy from my experience in there APIs, because you need to establish the connection and control for those objects and that has to be not only at the GDB level; but also when you are in the UI. – D.E.Wright Nov 8 '11 at 16:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.