GeneXus Extensions - 如何知道与 table 关联的 DataStore?

GeneXus Extensions - How to know the DataStore associated to a table?

我需要制作一个 GeneXus 扩展,它通过默认数据存储的 tables(但不在其他数据存储中)进行某些检查。

了解与 table 关联的数据存储的最佳方式是什么?

我可以检查 table 是否被 DataView 引用,但也许有更好的方法。

目前没有直接解决此查询的 API。事物建模的方式是 DataView 是将 Table 关联到 DataStoreCategory 的实体。

检查 cross-reference 是缩小问题范围的好方法 space,尽管要确定给定的数据视图绑定到给定的 table,您必须检查 AssociatedTableKey 属性.

另一件要记住的事情是,可能有一个数据视图关联到默认数据存储中的 table,或者多个数据视图绑定到相同的 table 和不同的数据存储。 无法保证模型在任何时候都处于有效状态,决定如何处理这些情况可能会影响您构建查询的方式。

此示例查询 returns 所有 table 与数据存储相关联。如果有多个数据视图关联到 table,它会检查第一个是否属于给定的数据存储。

IEnumerable<Table> GetTablesInDataStore(DataStoreCategory ds)
{
    foreach (EntityKey tblKey in Table.GetKeys(ds.Model))
    {
        if (IsInDataStore(tblKey, ds))
            yield return Table.Get(ds.Model, tblKey.Id);
    }
}

bool IsInDataStore(EntityKey tblKey, DataStoreCategory ds)
{
    DataView dv = GetDataView(ds.Model, tblKey);
    if (dv is null)
        return ds.IsDefault;
    else
        return Artech.Genexus.Common.Properties.XFL.GetDatastore(dv).Identifier == ds.Id;
}

DataView GetDataView(KBModel model, EntityKey tblKey)
{
    foreach (var r in model.GetReferencesTo(tblKey, LinkType.UsedObject, new[] { ObjClass.DataView }))
    {
        var dv = DataView.Get(model, r.From.Id);
        if (dv.AssociatedTableKey == tblKey)
            return dv;
    }
    return null;
}