ArcGIS Pro SDK (八)地理数据库 6 版本控制

ArcGIS Pro SDK (八)地理数据库 6 版本控制

文章目录

  • [ArcGIS Pro SDK (八)地理数据库 6 版本控制](#ArcGIS Pro SDK (八)地理数据库 6 版本控制)
    • [1 连接到版本](#1 连接到版本)
    • [2 在单独的编辑会话中协调版本并将其与其父级进行核对和提交](#2 在单独的编辑会话中协调版本并将其与其父级进行核对和提交)
    • [3 在同一编辑会话中协调版本并将其与其父级提交](#3 在同一编辑会话中协调版本并将其与其父级提交)
    • [4 使用版本](#4 使用版本)
    • [5 使用默认版本](#5 使用默认版本)
    • [6 创建版本](#6 创建版本)
    • [7 创建历史版本](#7 创建历史版本)
    • [8 在版本之间切换](#8 在版本之间切换)
    • [9 部分过账](#9 部分过账)

环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0

1 连接到版本

csharp 复制代码
public Geodatabase ConnectToVersion(Geodatabase geodatabase, string versionName)
{
    Geodatabase connectedVersion = null;

    if (geodatabase.IsVersioningSupported())
    {
        using (VersionManager versionManager = geodatabase.GetVersionManager())
            using (Version version = versionManager.GetVersion(versionName))
        {
            connectedVersion = version.Connect();
        }
    }
    return connectedVersion;
}

2 在单独的编辑会话中协调版本并将其与其父级进行核对和提交

csharp 复制代码
public void ReconcileAndPost(Geodatabase geodatabase)
{
    // 获取当前版本及其父版本的引用
    if (geodatabase.IsVersioningSupported())
    {
        using (VersionManager versionManager = geodatabase.GetVersionManager())
        using (Version currentVersion = versionManager.GetCurrentVersion())
        using (Version parentVersion = currentVersion.GetParent())
        {
            // 创建 ReconcileOptions 对象
            var reconcileOptions = new ReconcileOptions(parentVersion)
            {
                ConflictResolutionMethod = ConflictResolutionMethod.Continue, // 发现冲突时继续
                ConflictDetectionType = ConflictDetectionType.ByRow, // 默认值
                ConflictResolutionType = ConflictResolutionType.FavorTargetVersion // 或者 FavorEditVersion
            };

            // 执行协调
            ReconcileResult reconcileResult = currentVersion.Reconcile(reconcileOptions);
            if (!reconcileResult.HasConflicts)
            {
                // 无冲突,执行过账
                var postOptions = new PostOptions(parentVersion)
                {
                    ServiceSynchronizationType = ServiceSynchronizationType.Synchronous // 默认值
                };
                currentVersion.Post(postOptions);
            }
        }
    }
}

3 在同一编辑会话中协调版本并将其与其父级提交

csharp 复制代码
public void ReconcileAndPost2(Geodatabase geodatabase)
{
    // 获取当前版本及其父版本的引用
    if (geodatabase.IsVersioningSupported())
    {
        using (VersionManager versionManager = geodatabase.GetVersionManager())
        using (Version currentVersion = versionManager.GetCurrentVersion())
        using (Version parentVersion = currentVersion.GetParent())
        {
            // 创建 ReconcileOptions 对象
            var reconcileOptions = new ReconcileOptions(parentVersion)
            {
                ConflictResolutionMethod = ConflictResolutionMethod.Continue, // 发现冲突时继续
                ConflictDetectionType = ConflictDetectionType.ByRow, // 默认值
                ConflictResolutionType = ConflictResolutionType.FavorTargetVersion // 或者 FavorEditVersion
            };

            // 创建 PostOptions 对象
            var postOptions = new PostOptions(parentVersion)
            {
                ServiceSynchronizationType = ServiceSynchronizationType.Synchronous // 默认值
            };

            // 执行协调和过账
            ReconcileResult reconcileResult = currentVersion.Reconcile(reconcileOptions, postOptions);
            if (reconcileResult.HasConflicts)
            {
                // 处理冲突
                // TODO 解决冲突
            }
        }
    }
}

4 使用版本

csharp 复制代码
public async Task WorkingWithVersions()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
        () =>
        {
            using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri("path\\to\\sde\\file"))))
                using (VersionManager versionManager = geodatabase.GetVersionManager())
            {
                IReadOnlyList<Version> versionList = versionManager.GetVersions();

                // 默认版本的父版本为 null
                Version defaultVersion = versionList.First(version => version.GetParent() == null);

                IEnumerable<Version> publicVersions = versionList.Where(
                    version => version.GetAccessType() == VersionAccessType.Public);
                Version qaVersion = defaultVersion.GetChildren().First(
                    version => version.GetName().Contains("QA"));

                Geodatabase qaVersionGeodatabase = qaVersion.Connect();

                FeatureClass currentFeatureClass = geodatabase.OpenDataset<FeatureClass>("featureClassName");
                FeatureClass qaFeatureClass = qaVersionGeodatabase.OpenDataset<FeatureClass>("featureClassName");
            }
        });
}

5 使用默认版本

csharp 复制代码
// 检查当前版本是否为默认版本
// 适用于分支和传统版本管理
public bool IsDefaultVersion(Version version)
{
    Version parentVersion = version.GetParent();
    if (parentVersion == null)
    {
        return true;
    }
    parentVersion.Dispose();
    return false;
}

public bool IsDefaultVersion(Geodatabase geodatabase)
{
    if (!geodatabase.IsVersioningSupported()) return false;
    using (VersionManager versionManager = geodatabase.GetVersionManager())
        using (Version currentVersion = versionManager.GetCurrentVersion())
    {
        return IsDefaultVersion(currentVersion);
    }
}

// 获取默认版本
// 适用于分支和传统版本管理
// 此方法依赖于 IsDefaultVersion() 方法
public Version GetDefaultVersion(Version version)
{
    if (IsDefaultVersion(version))
    {
        return version;
    }
    else
    {
        Version parent = version.GetParent();
        Version ancestor = GetDefaultVersion(parent);
        if (parent != ancestor)
        {
            parent.Dispose(); // 如果版本树超过两层深,释放中间版本对象
        }
        return ancestor;
    }
}

public Version GetDefaultVersion(Geodatabase geodatabase)
{
    if (!geodatabase.IsVersioningSupported()) return null;

    using (VersionManager versionManager = geodatabase.GetVersionManager())
    {
        Version currentVersion = versionManager.GetCurrentVersion();
        Version defaultVersion = GetDefaultVersion(currentVersion);
        if (currentVersion != defaultVersion)
        {
            currentVersion.Dispose(); // 如果当前版本不是默认版本,释放当前版本对象
        }
        return defaultVersion;
    }
}

6 创建版本

csharp 复制代码
public Version CreateVersion(Geodatabase geodatabase, string versionName, string description, VersionAccessType versionAccessType)
{
    if (!geodatabase.IsVersioningSupported()) return null;

    using (VersionManager versionManager = geodatabase.GetVersionManager())
    {
        VersionDescription versionDescription = new VersionDescription(versionName, description, versionAccessType);
        return versionManager.CreateVersion(versionDescription);
    }
}

7 创建历史版本

csharp 复制代码
public HistoricalVersion CreateHistoricalVersion(Geodatabase geodatabase, string versionName)
{
    using (VersionManager versionManager = geodatabase.GetVersionManager())
    {
        HistoricalVersionDescription historicalVersionDescription = new HistoricalVersionDescription(versionName, DateTime.Now);
        HistoricalVersion historicalVersion = versionManager.CreateHistoricalVersion(historicalVersionDescription);

        return historicalVersion;
    }
}

8 在版本之间切换

csharp 复制代码
public void ChangeVersions(Geodatabase geodatabase, string toVersionName)
{
    using (VersionManager versionManager = geodatabase.GetVersionManager())
    {
        VersionBaseType versionBaseType = versionManager.GetCurrentVersionBaseType();

        if (versionBaseType == VersionBaseType.Version)
        {
            Version fromVersion = versionManager.GetCurrentVersion();
            Version toVersion = versionManager.GetVersion(toVersionName);

            // 在版本之间切换
            MapView.Active.Map.ChangeVersion(fromVersion, toVersion);
        }

        if (versionBaseType == VersionBaseType.HistoricalVersion)
        {
            HistoricalVersion fromHistoricalVersion = versionManager.GetCurrentHistoricalVersion();
            HistoricalVersion toHistoricalVersion = versionManager.GetHistoricalVersion(toVersionName);

            // 在历史版本之间切换
            MapView.Active.Map.ChangeVersion(fromHistoricalVersion, toHistoricalVersion);
        }

        // 从历史版本切换到版本,反之亦然
        // MapView.Active.Map.ChangeVersion(fromHistoricalVersion, toVersion);
        // MapView.Active.Map.ChangeVersion(fromVersion, toHistoricalVersion);
    }
}

9 部分过账

csharp 复制代码
// 部分过账允许开发人员提交版本中的部分更改。
// 一个示例用例是电力公用事业公司使用版本来设计新的住宅细分区的设施。
// 在流程的某个阶段,一个街区的新房屋已经建成,而细分区的其余部分尚未建造。
// 部分过账允许用户提交已完成的工作,同时保留版本中尚未建成的要素,以便以后提交。
// 部分过账需要使用 ArcGIS Enterprise 10.9 及更高版本的分支版本化要素服务。

// 指定已构建的要素集合
QueryFilter constructedFilter = new QueryFilter()
{
    WhereClause = "ConstructedStatus = 'True'"
};

// 此选择表示我们希望提交到支持结构要素类的插入和更新
using (Selection constructedSupportStructures = supportStructureFeatureClass.Select(
    constructedFilter, SelectionType.ObjectID, SelectionOption.Normal))
{
    // 指定要提交的删除要素稍微复杂,因为无法发出查询来获取已删除要素的集合,必须使用 ObjectIDs 的列表。
    using (Selection deletedSupportStructures = supportStructureFeatureClass.Select(
        null, SelectionType.ObjectID, SelectionOption.Empty))
    {
        deletedSupportStructures.Add(deletedSupportStructureObjectIDs);  // deletedSupportStructureObjectIDs 定义为 List<long>

        // 执行带有部分过账的协调
        // 在 2.x 版本中 -
        // ReconcileDescription reconcileDescription = new ReconcileDescription();
        // reconcileDescription.ConflictDetectionType = ConflictDetectionType.ByColumn;
        // reconcileDescription.ConflictResolutionMethod = ConflictResolutionMethod.Continue;
        // reconcileDescription.ConflictResolutionType = ConflictResolutionType.FavorEditVersion;
        // reconcileDescription.PartialPostSelections = new List<Selection>() { constructedSupportStructures, deletedSupportStructures };
        // reconcileDescription.WithPost = true;

        // ReconcileResult reconcileResult = designVersion.Reconcile(reconcileDescription);

        var reconcileOptions = new ReconcileOptions();  // 协调选项,针对默认版本
        reconcileOptions.ConflictDetectionType = ConflictDetectionType.ByColumn;
        reconcileOptions.ConflictResolutionMethod = ConflictResolutionMethod.Continue;
        reconcileOptions.ConflictResolutionType = ConflictResolutionType.FavorEditVersion;

        var postOptions = new PostOptions();  // 提交选项,针对默认版本
        postOptions.PartialPostSelections = new List<Selection>() { 
            constructedSupportStructures, deletedSupportStructures 
        };
        postOptions.ServiceSynchronizationType = ServiceSynchronizationType.Synchronous;

        var reconcileResult = designVersion.Reconcile(reconcileOptions, postOptions);

        // 处理结果
        // TODO 处理结果的逻辑
    }
}
相关推荐
呆呆小雅1 小时前
C#关键字volatile
java·redis·c#
boligongzhu1 小时前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
web147862107231 小时前
C# .Net Web 路由相关配置
前端·c#·.net
Jasmine_llq2 小时前
《 火星人 》
算法·青少年编程·c#
军训猫猫头4 小时前
20.抽卡只有金,带保底(WPF) C#
ui·c#·wpf
wuningw5 小时前
ant-design-ui的Select选择器多选时同时获取label与vaule值
ui·arcgis
向宇it14 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
向宇it15 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
坐井观老天20 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
supermapsupport1 天前
iClent3D for Cesium 实现无人机巡检飞行效果
gis·cesium·supermap·webgis