Partager via


Entities

Paramètres de configuration pour les entités de base de données.

Health

Property Description
entities.entity-name.health.enabled Active les vérifications d’intégrité de l’entité (points de terminaison REST et GraphQL)
entities.entity-name.health.first Nombre de lignes retournées dans la requête de contrôle d’intégrité (plage : 1 à 500)
entities.entity-name.health.threshold-ms Durée maximale en millisecondes pour la requête de contrôle d’intégrité (min : One)

Description

Property Description
entities.entity-name.description Description lisible par l’homme de l’entité

Fields

Property Description
entities.entity-name.fields[].name Nom du champ de base de données (obligatoire)
entities.entity-name.fields[].alias Nom exposé à l’API (remplace les mappages)
entities.entity-name.fields[].description Description du champ lisible par l’homme
entities.entity-name.fields[].primary-key Marque le champ en tant que clé primaire (remplace les champs clés)

Source

Property Description
entities.entity-name.source.type Type d’objet : table, viewou stored-procedure
entities.entity-name.source.object Nom de l’objet de base de données
entities.entity-name.source.object-description Description lisible par l’homme de l’objet de base de données
entities.entity-name.source.parameters Paramètres des procédures stockées ou des fonctions
entities.entity-name.source.key-fields Liste des champs de clé primaire pour les vues (déconseillées)
entities.entity-name.mappings Mappe les noms de champs d’API aux colonnes de base de données (déconseillées)

REST

Property Description
entities.entity-name.rest.enabled Active REST pour cette entité
entities.entity-name.rest.path Itinéraire personnalisé pour le point de terminaison REST
entities.entity-name.rest.methods Méthodes REST autorisées : get, , postput, patchdelete

GraphQL

Property Description
entities.entity-name.graphql.type Nom de type ou objet avec singular et plural
entities.entity-name.graphql.operation Type d’opération : query ou mutation
entities.entity-name.graphql.enabled Active GraphQL pour cette entité

Permissions

Property Description
entities.entity-name.permissions[].role Chaîne de nom de rôle
entities.entity-name.permissions[].actions Un ou plusieurs des éléments suivants : create, read, update, delete, execute

Relationships

Property Description
entities.entity-name.relationships.relationship-name.cardinality one ou many
entities.entity-name.relationships.relationship-name.target.entity Nom de l’entité cible
entities.entity-name.relationships.relationship-name.source.fields Champs de cette entité utilisée dans la relation
entities.entity-name.relationships.relationship-name.target.fields Champs de l’entité cible
entities.entity-name.relationships.relationship-name.linking.object Objet join utilisé pour les relations plusieurs-à-plusieurs
entities.entity-name.relationships.relationship-name.linking.source.fields Champs de l’entité source utilisée dans la jointure
entities.entity-name.relationships.relationship-name.linking.target.fields Champs de l’entité cible utilisée dans la jointure

Cache

Property Description
entities.entity-name.cache.enabled Active la mise en cache des réponses pour l’entité
entities.entity-name.cache.ttl-seconds Durée de vie du cache en secondes
entities.entity-name.cache.level Niveau du cache : L1 (en mémoire uniquement) ou L1L2 (en mémoire + distribué)

MCP

Property Description
entities.entity-name.mcp Objet qui contrôle la participation mcP (Model Context Protocol) pour l’entité
entities.entity-name.mcp.dml-tools Active ou désactive les outils DML (Data Manipulation Language) pour l’entité
entities.entity-name.mcp.custom-tool Inscrit la procédure stockée en tant qu’outil MCP nommé (entités de procédure stockée uniquement)

Vue d’ensemble du format

{
  "entities": {
    "{entity-name}": {
      "description": <string>,
      "rest": {
        "enabled": <boolean> // default: true
        "path": <string> // default: "{entity-name}"
        "methods": ["GET", "POST"] // default: ["GET", "POST"]
      },
      "graphql": {
        "enabled": <boolean> // default: true
        "type": {
          "singular": <string>,
          "plural": <string>
        },
        "operation": "query" | "mutation" // default: "query"
      },
      "source": {
        "object": <string>,
        "object-description": <string>,
        "type": "view" | "stored-procedure" | "table",
        "key-fields": [<string>], // DEPRECATED: use fields[].primary-key
        "parameters": [ // array format (preferred)
          {
            "name": "<parameter-name>",
            "required": <boolean>,
            "default": <value>,
            "description": "<string>"
          }
        ]
      },
      "fields": [
        {
          "name": "<database-field-name>",
          "alias": "<api-exposed-name>",
          "description": "<string>",
          "primary-key": <boolean>
        }
      ],
      "mappings": { // DEPRECATED: use fields[].alias
        "<database-field-name>": <string>
      },
      "relationships": {
        "<relationship-name>": {
          "cardinality": "one" | "many",
          "target.entity": <string>,
          "source.fields": [<string>],
          "target.fields": [<string>],
          "linking.object": <string>,
          "linking.source.fields": [<string>],
          "linking.target.fields": [<string>]
        }
      },
      "permissions": [
        {
          "role": "anonymous" | "authenticated" | <custom-role>,
          "actions": ["create", "read", "update", "delete", "execute", "*"],
          "fields": {
            "include": [<string>],
            "exclude": [<string>]
          },
          "policy": {
            "database": <string>
          }
        }
      ],
      "cache": {
        "enabled": <boolean>,
        "ttl-seconds": <integer>,
        "level": "L1" | "L1L2" // default: "L1L2"
      },
      "mcp": {
        "dml-tools": <boolean>,       // default: true
        "custom-tool": <boolean>      // stored-procedure only; default: false
      }
    }
  }
}

Source (entités de nom d’entité)

Parent Property Type Required Default
entities.{entity-name} source object ✔️ Oui None

Détails de la source de base de données de l’entité.

Propriétés imbriquées

Parent Property Type Required Default
entities.{entity-name}.source object string ✔️ Oui None
entities.{entity-name}.source object-description string ❌ Non None
entities.{entity-name}.source type enum (table, , viewstored-procedure) ✔️ Oui None
entities.{entity-name}.source key-fields tableau de chaînes ❌ Non* None
entities.{entity-name}.source parameters objet ou tableau ❌ Non** None

* key-fields n’est nécessaire que lorsque typeview le fields tableau n’est pas utilisé. La valeur représente les clés primaires.

Avertissement

La key-fields propriété est déconseillée dans DAB 2.0. Utilisez plutôt le fields tableau primary-key: true . Le schéma applique cela fields et key-fields ne peut pas coexister sur la même entité.

** parameters n’est nécessaire que lorsque type c’est stored-procedure et uniquement pour les paramètres avec des valeurs par défaut. Le type de données du paramètre est déduit. Les paramètres sans valeur par défaut peuvent être omis.

object-description est une description facultative lisible par l’homme de l’objet de base de données sous-jacent. Cette valeur est exposée pendant la découverte d’outils MCP, ce qui aide les agents IA à comprendre l’objectif de l’entité.

Tip

Si l’objet appartient au schéma dbo, la spécification du schéma est facultative. En outre, les crochets autour des noms d’objets (par exemple, dbo.Users vs. [dbo].[Users]) peuvent être utilisés lorsque nécessaire.

Format

{
  "entities": {
    "{entity-name}": {
      "source": {
        "object": <string>,
        "object-description": <string>,
        "type": <"view" | "stored-procedure" | "table">,
        "key-fields": [ <string> ], // DEPRECATED: use fields[].primary-key
        "parameters": [ // array format (preferred)
          {
            "name": "<parameter-name>",
            "required": <boolean>,
            "default": <value>,
            "description": "<string>"
          }
        ]
      }
    }
  }
}

Format du tableau de paramètres

Dans la préversion de DAB 2.0, parameters prend en charge un format de tableau structuré avec des métadonnées plus riches. Chaque paramètre est un objet avec les propriétés suivantes :

Property Type Required Description
name string ✔️ Oui Nom du paramètre (sans préfixe @ )
required boolean ❌ Non Indique si le paramètre est obligatoire (true) ou facultatif (false)
default n'importe quel ❌ Non Valeur par défaut utilisée lorsque le paramètre n’est pas fourni
description string ❌ Non Description lisible par l’homme du paramètre

Exemple (format de tableau , préféré)

{
  "entities": {
    "GetBookById": {
      "source": {
        "type": "stored-procedure",
        "object": "dbo.get_book_by_id",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "default": null,
            "description": "The unique identifier of the book"
          }
        ]
      }
    }
  }
}

Avertissement

Le format de dictionnaire pour parameters (par exemple) { "id": 0 }est déconseillé dans DAB 2.0. Utilisez le format de tableau précédent. L’ancien format est toujours accepté pour la compatibilité descendante, mais sera supprimé dans une prochaine version.

Note

La fonctionnalité 2.0 du Générateur d’API de données décrite dans cette section est actuellement en préversion et peut changer avant la disponibilité générale. Pour plus d’informations, consultez Nouveautés de la version 2.0.

Autorisations (entités de nom d’entité)

Parent Property Type Required Default
entities.permissions role string ✔️ Oui None

Spécifie le nom du rôle auquel s’appliquent les autorisations. Utilisez des rôles système (Anonymous, Authenticated) ou des rôles personnalisés définis dans votre fournisseur d’identité.

Tip

Pour plus d’informations sur l’évaluation des rôles, les rôles système et l’en-tête, consultez Vue d’ensemble de l’autorisationX-MS-API-ROLE.

Format

{
  "entities": {
    "{entity-name}": {
      "permissions": [
        {
          "role": <"Anonymous" | "Authenticated" | "custom-role">,
          "actions": [ <string> ]
        }
      ]
    }
  }
}

Example

{
  "entities": {
    "User": {
      "permissions": [
        {
          "role": "reader",
          "actions": ["read"]
        }
      ]
    }
  }
}

Héritage de rôle

DAB 2.0 introduit l’héritage des rôles pour les autorisations d’entité. Lorsqu’un rôle n’est pas configuré explicitement pour une entité, il hérite des autorisations d’un rôle plus large à l’aide de la chaîne suivante :

named-role → authenticated → anonymous
  • S’il authenticated n’est pas configuré pour une entité, il hérite de anonymous.
  • Si un rôle nommé n’est pas configuré, il hérite ou authenticateds’il anonymousauthenticated est également absent.

Cela signifie que vous pouvez définir des autorisations une fois sur anonymous et chaque rôle plus large obtient automatiquement le même accès, sans duplication requise.

Note

La fonctionnalité 2.0 du Générateur d’API de données décrite dans cette section est actuellement en préversion et peut changer avant la disponibilité générale. Pour plus d’informations, consultez Nouveautés de la version 2.0.

Example

{
  "entities": {
    "Book": {
      "source": "dbo.books",
      "permissions": [
        { "role": "anonymous", "actions": [ "read" ] }
      ]
    }
  }
}

Avec cette configuration, anonymous, authenticatedet tout rôle nommé non configuré peut tous lire Book. Permet dab configure --show-effective-permissions de voir les autorisations résolues pour chaque entité après l’application de l’héritage.

Actions (entités entity-name d’autorisations de tableau de chaînes)

Parent Property Type Required Default
entities.permissions actions oneOf [chaîne, tableau] ✔️ Oui None

Tableau de chaînes détaillant les opérations autorisées pour le rôle associé.

Action Opération SQL
* Toutes les actions
create Insérer une ou plusieurs lignes*
read Sélectionner une ou plusieurs lignes
update Modifier une ou plusieurs lignes*
delete Supprimer une ou plusieurs lignes*
execute Exécute une procédure stockée

* Actuellement, plusieurs opérations sont uniquement prises en charge dans GraphQL.

Note

Pour les procédures stockées, l’action générique (*) s’étend uniquement à l’action execute. Pour les tables et les vues, il s’étend à create, read, updateet delete.

Format

{
  "entities": {
    "{entity-name}": {
      "permissions": [
        {
          "actions": [ <string> ]
        }
      ]
    }
  }
}

Example

{
  "entities": {
    "{entity-name}": {
      "permissions": [
        {
          "actions": [ "*" ] // equivalent to create, read, update, delete
        }
      ]
    }
  }
}

Autre format (chaîne uniquement, quand type=stored-procedure)

{
  "entities": {
    "{entity-name}": {
      "permissions": [
        {
          "actions": <string>
        }
      ]
    }
  }
}

Example

{
  "entities": {
    "{entity-name}": {
      "permissions": [
        {
          "actions": "*" // equivalent to execute
        }
      ]
    }
  }
}

Actions (entités entity-name d’autorisations de tableau d’objets)

Parent Property Type Required Default
entities.{entity-name}.permissions actions tableau de chaînes ✔️ Oui None

Tableau d’objets détaillant les opérations autorisées pour le rôle associé.

Note

Pour les procédures stockées, l’action générique (*) s’étend uniquement à execute. Pour les tables/vues, il s’étend à create, read, updateet delete.

Propriétés imbriquées

Parent Property Type Required Default
entities.{entity-name}.permissions.actions[] action string ✔️ Oui None
entities.{entity-name}.permissions.actions[] fields object ❌ Non None
entities.{entity-name}.permissions.actions[] policy object ❌ Non None
entities.{entity-name}.permissions.actions[].policy database string ✔️ Oui None

Format

{
  "entities": {
    "{entity-name}": {
      "permissions": [
        {
          "role": <string>,
          "actions": [
            {
              "action": <string>,
              "fields": <array of strings>,
              "policy": <object>
            }
          ]
        }
      ]
    }
  }

Example

Cela accorde read l’autorisation à auditor l’entité User , avec des restrictions de champ et de stratégie.

{
  "entities": {
    "User": {
      "permissions": [
        {
          "role": "auditor",
          "actions": [
            {
              "action": "read",
              "fields": {
                "include": ["*"],
                "exclude": ["last_login"]
              },
              "policy": {
                "database": "@item.IsAdmin eq false"
              }
            }
          ]
        }
      ]
    }
  }
}

Notes de stratégie

Les stratégies de base de données filtrent les résultats des requêtes à l’aide de prédicats de style OData. Permet @item.<field> de référencer des champs d’entité et @claims.<type> d’injecter des revendications utilisateur authentifiées.

Aspect Détails
Syntaxe Prédicats OData (eq, , neand, orgt, lt)
Référence de champ @item.<field> (utilisez le nom mappé le cas échéant)
Référence de revendication @claims.<claimType>
Actions prises en charge read, updatedelete
Non prise en charge create, execute

Tip

Pour obtenir des conseils complets sur les stratégies de base de données, notamment la substitution de revendication et la résolution des problèmes, consultez Configurer des stratégies de base de données.

Type (entités de nom d’entité GraphQL)

Parent Property Type Required Default
entities.{entity-name}.graphql type object ❌ Non {entity-name}

Définit la convention d’affectation de noms pour une entité dans le schéma GraphQL.

Format

{
  "entities": {
    "{entity-name}": {
      "graphql": {
        "type": {
          "singular": "<string>",
          "plural": "<string>"
        }
      }
    }
  }
}

Propriétés imbriquées

Parent Property Required Type Default
entities.{entity-name}.graphql.type singular ✔️ Oui* string None
entities.{entity-name}.graphql.type plural ❌ Non string N/A (valeur par défaut unique)

* singular est obligatoire lorsqu’il type est spécifié en tant qu’objet. Lorsqu’il type s’agit d’une chaîne simple, cette chaîne est utilisée comme nom singulier.

Example

Configuration

{
  "entities": {
    "User": {
      "graphql": {
        "type": {
          "singular": "User",
          "plural": "Users"
        }
      }
    }
  }
}

Requête GraphQL

{
  Users {
    items {
      id
      name
      age
      isAdmin
    }
  }
}

Réponse GraphQL

{
  "data": {
    "Users": {
      "items": [
        {
          "id": 1,
          "name": "Alice",
          "age": 30,
          "isAdmin": true
        },
        {
          "id": 2,
          "name": "Bob",
          "age": 25,
          "isAdmin": false
        }
        // ...
      ]
    }
  }
}

Opération (entités de nom d’entité GraphQL)

Parent Property Type Required Default
entities.{entity-name}.graphql operation chaîne d’énumération ❌ Non mutation

Indique si l’opération stored-procedure apparaît sous le Query ou Mutation.

Note

Lorsqu’il {entity-name}.type est défini stored-proceduresur , un nouveau type executeXXX GraphQL est créé automatiquement. Cette operation propriété contrôle l’emplacement où ce type est placé dans le schéma GraphQL. Il n’y a aucun impact fonctionnel, juste une hygiène de schéma.

Format

{
  "entities": {
    "{entity-name}": {
      "graphql": {
        "operation": "query" | "mutation"
      }
    }
  }
}

Exemple : opération

Quand operation est défini sur query

type Query {
  executeGetUserDetails(userId: Int!): GetUserDetailsResponse
}

Quand operation est défini sur mutation

type Mutation {
  executeGetUserDetails(userId: Int!): GetUserDetailsResponse
}

Activé (entités de nom d’entité GraphQL)

Parent Property Type Required Default
entities.{entity-name}.graphql enabled boolean ❌ Non True

Permet aux développeurs d’inclure de manière sélective des entités dans le schéma GraphQL.

Format

{
  "entities": {
    "{entity-name}": {
      "graphql": {
        "enabled": <true> (default) | <false>
      }
    }
  }
}

REST (entités de nom d’entité)

Parent Property Type Required Default
entities.{entity-name}.rest enabled boolean ❌ Non True
entities.rest path string ❌ Non /{entity-name}
entities.{entity-name}.rest methods tableau de chaînes ❌ Non* POST

* La methods propriété est uniquement destinée aux stored-procedure points de terminaison.

Note

La fonctionnalité 2.0 du Générateur d’API de données décrite dans cette section est actuellement en préversion et peut changer avant la disponibilité générale. Pour plus d’informations, consultez Nouveautés de la version 2.0.

Format

{
  "entities": {
    "{entity-name}": {
      "rest": {
        "enabled": <true> (default) | <false>,
        "path": <string; default: "{entity-name}">
      }
    }
  }
}

Description (entités de nom d’entité)

Parent Property Type Required Default
entities.{entity-name} description string ❌ Non None

Description facultative lisible par l’homme de l’entité. Cette valeur est exposée dans la documentation de l’API générée et en tant que commentaire dans le schéma GraphQL.

Note

La fonctionnalité 2.0 du Générateur d’API de données décrite dans cette section est actuellement en préversion et peut changer avant la disponibilité générale. Pour plus d’informations, consultez Nouveautés de la version 2.0.

Format

{
  "entities": {
    "{entity-name}": {
      "description": "<string>"
    }
  }
}

Example

{
  "entities": {
    "Book": {
      "description": "Represents a book in the catalog with title, author, and pricing information.",
      "source": {
        "object": "dbo.books",
        "type": "table"
      }
    }
  }
}

Champs (entités de nom d’entité)

Parent Property Type Required Default
entities.{entity-name} fields tableau ❌ Non None

Définit les métadonnées des champs de base de données individuels, y compris les alias, les descriptions et les désignations de clé primaire. Le fields tableau remplace les deux mappings (via la alias propriété) et source.key-fields (via la primary-key propriété) dans une structure unifiée unique.

Note

La fonctionnalité 2.0 du Générateur d’API de données décrite dans cette section est actuellement en préversion et peut changer avant la disponibilité générale. Pour plus d’informations, consultez Nouveautés de la version 2.0.

Propriétés imbriquées

Parent Property Type Required Default
entities.{entity-name}.fields[] name string ✔️ Oui None
entities.{entity-name}.fields[] alias string ❌ Non None
entities.{entity-name}.fields[] description string ❌ Non None
entities.{entity-name}.fields[] primary-key boolean ❌ Non false

Format

{
  "entities": {
    "{entity-name}": {
      "fields": [
        {
          "name": "<database-field-name>",
          "alias": "<api-exposed-name>",
          "description": "<string>",
          "primary-key": <boolean>
        }
      ]
    }
  }
}

Example

{
  "entities": {
    "Book": {
      "source": {
        "object": "dbo.books",
        "type": "table"
      },
      "fields": [
        {
          "name": "id",
          "description": "Unique book identifier",
          "primary-key": true
        },
        {
          "name": "sku_title",
          "alias": "title",
          "description": "The display title of the book"
        },
        {
          "name": "sku_status",
          "alias": "status"
        }
      ]
    }
  }
}

Dans cet exemple, id est désigné comme clé primaire (en remplaçant la nécessité), source.key-fieldstandis sku_title qu’elle sku_status est alias et titlestatus (remplacement de la nécessité).mappings

Important

Le schéma applique qui fields ne peut pas coexister avec mappings ou source.key-fields sur la même entité. Migrez vers fields et supprimez les propriétés déconseillées.

Mappages (entités de nom d’entité)

Avertissement

La mappings propriété est déconseillée dans DAB 2.0. Utilisez plutôt le fields tableau avec la alias propriété. Le schéma applique cela fields et mappings ne peut pas coexister sur la même entité.

Parent Property Type Required Default
entities.{entity-name} mappings object ❌ Non None

Active les alias personnalisés ou les noms exposés pour les champs d’objet de base de données.

Important

Pour les entités avec GraphQL activée, le nom exposé configuré doit répondre aux exigences de nom GraphQL.

Format

{
  "entities": {
    "{entity-name}": {
      "mappings": {
        "<field-1-name>": "<field-1-alias>",
        "<field-2-name>": "<field-2-alias>",
        "<field-3-name>": "<field-3-alias>"
      }
    }
  }
}

Examples

Table de base de données

CREATE TABLE Books
(
  id INT,
  sku_title VARCHAR(50),
  sku_status VARCHAR(50),
)

Configuration

{
  "entities": {
    "Books": {
      ...
      "mappings": {
        "sku_title": "title",
        "sku_status": "status"
      }
    }
  }
}

Cache (entités de nom d’entité)

Parent Property Type Required Default
entities.{entity-name} cache object ❌ Non None

Active et configure la mise en cache de l’entité.

Propriétés imbriquées

Parent Property Type Required Default
entities.{entity-name}.cache enabled boolean ❌ Non False
entities.{entity-name}.cache ttl-seconds integer ❌ Non -
entities.{entity-name}.cache level enum (L1 | L1L2) ❌ Non L1L2

Format

{
  "entities": {
    "{entity-name}": {
      "cache": {
        "enabled": <true> (default) | <false>,
        "ttl-seconds": <integer; default: 5>,
        "level": <"L1" | "L1L2"> (default: "L1L2")
      }
    }
  }
}

La propriété contrôle les level niveaux de cache utilisés :

Valeur Description
L1 Cache en mémoire uniquement. Le plus rapide, mais pas partagé entre les instances.
L1L2 Cache en mémoire plus cache distribué (Redis). Partagé entre les instances mises à l’échelle. Default.

Note

La fonctionnalité 2.0 du Générateur d’API de données décrite dans cette section est actuellement en préversion et peut changer avant la disponibilité générale. Pour plus d’informations, consultez Nouveautés de la version 2.0.

Note

Lorsqu’elle n’est pas spécifiée, ttl-seconds hérite de la valeur globale définie sous runtime.cache.

Example

{
  "entities": {
    "Author": {
      "cache": {
        "enabled": true,
        "ttl-seconds": 30,
        "level": "L1"
      }
    }
  }
}

Relations (entités de nom d’entité)

Parent Property Type Required Default
entities.{entity-name} relationships object ❌ Non None

Configure la façon dont les entités GraphQL sont liées à d’autres entités exposées. Pour plus d’informations, consultez répartition des relations du générateur d’API de données.

Note

La relationship-name propriété de chaque relation doit être unique dans toutes les relations de cette entité.

Propriétés imbriquées

Ces propriétés sont utilisées dans différentes combinaisons en fonction de la cardinalité de relation.

Parent Property Type Required Default
entities.{entity-name}.relationships cardinality string ✔️ Oui None
entities.{entity-name}.relationships target.entity string ✔️ Oui None
entities.{entity-name}.relationships target.fields tableau de chaînes ❌ Non None
entities.{entity-name}.relationships source.fields tableau de chaînes ❌ Non None
entities.{entity-name}.relationships linking.object string ❌ Non None
entities.{entity-name}.relationships linking.source.fields tableau de chaînes ❌ Non None
entities.{entity-name}.relationships linking.target.fields tableau de chaînes ❌ Non None

Format

{
  "entities": {
    "{entity-name}": {
      "relationships": {
        "<relationship-name>": {
          "cardinality": "one" | "many",
          "target.entity": "<string>",
          "source.fields": ["<string>"],
          "target.fields": ["<string>"],
          "linking.object": "<string>",
          "linking.source.fields": ["<string>"],
          "linking.target.fields": ["<string>"]
        }
      }
    }
  }
}
Relationship Cardinality Example
one-to-many many Une entité de catégorie peut être liée à de nombreuses entités todo
many-to-one one De nombreuses entités todo peuvent se rapporter à une entité de catégorie
many-to-many many Une entité todo peut être liée à de nombreuses entités utilisateur, et une entité utilisateur peut se rapporter à de nombreuses entités todo

Exemple : cardinalité un-à-un

Chacun Profile est lié à exactement un User, et chacun User a exactement un associé Profile.

{
  "entities": {
    "User": {
      "relationships": {
        "user_profile": {
          "cardinality": "one",
          "target.entity": "Profile",
          "source.fields": [ "id" ],
          "target.fields": [ "user_id" ]
        }
      }
    },
    "Profile": {
      ...
    }
  }
}

Schéma GraphQL

type User
{
  id: Int!
  ...
  profile: Profile
}

Command-line

dab update User \
  --relationship profile \
  --target.entity Profile \
  --cardinality one \
  --relationship.fields "id:user_id"

Exemple : cardinalité un-à-plusieurs

Un Category peut avoir une ou plusieurs entités associées Book , tandis que chacun Book peut avoir un associé Category.

{
  "entities": {
    "Book": {
      ...
    },
    "Category": {
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

Schéma GraphQL

type Category
{
  id: Int!
  ...
  books: [BookConnection]!
}

Ligne de commande

dab update Category \
  --relationship category_books \
  --target.entity Book \
  --cardinality many \
  --relationship.fields "id:category_id"

Exemple : cardinalité plusieurs-à-un

De nombreuses Book entités peuvent avoir une entité associée Category, tandis qu’une Category ou plusieurs entrées associées peuvent être associées Book .

{
  "entities": {
    "Book": {
      "relationships": {
        "books_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      },
      "Category": {
        ...
      }
    }
  }
}

Schéma GraphQL

type Book
{
  id: Int!
  ...
  category: Category
}

Ligne de commande

dab update Book \
  --relationship books_category \
  --target.entity "Category" \
  --cardinality one \
  --relationship.fields "category_id:id"

Exemple : cardinalité plusieurs-à-plusieurs

De nombreuses Book entités peuvent avoir de nombreuses entités associées Author , tandis que de nombreuses Author entités peuvent avoir de nombreuses entrées associées Book .

Note

Cette relation est possible avec une troisième table, dbo.books_authorsque nous appelons l’objet de liaison.

{
  "entities": {
    "Book": {
      "relationships": {
        ...,
        "books_authors": {
          "cardinality": "many",
          "target.entity": "Author",
          "source.fields": [ "id" ],
          "target.fields": [ "id" ],
          "linking.object": "dbo.books_authors",
          "linking.source.fields": [ "book_id" ],
          "linking.target.fields": [ "author_id" ]
        }
      },
      "Category": {
        ...
      },
      "Author": {
        ...
      }
    }
  }
}

Schéma GraphQL

type Book
{
  id: Int!
  ...
  authors: [AuthorConnection]!
}

type Author
{
  id: Int!
  ...
  books: [BookConnection]!
}

Ligne de commande

dab update Book \
  --relationship books_authors \
  --target.entity "Author" \
  --cardinality many \
  --relationship.fields "id:id" \
  --linking.object "dbo.books_authors" \
  --linking.source.fields "book_id" \
  --linking.target.fields "author_id"

Intégrité (entités de nom d’entité)

Parent Property Type Required Default
entities.{entity-name} health object ❌ Non None

Active et configure les vérifications d’intégrité pour l’entité.

Propriétés imbriquées

Parent Property Type Required Default
entities.{entity-name}.health enabled boolean ❌ Non true
entities.{entity-name}.health first integer ❌ Non 100
entities.{entity-name}.health threshold-ms integer ❌ Non 1000

Example

{
  "entities": {
    "Book": {
      "health": {
        "enabled": true,
        "first": 3,
        "threshold-ms": 500
      }
    }
  }
}

Note

La first valeur doit être inférieure ou égale au runtime.pagination.max-page-size paramètre. Les valeurs plus petites aident les contrôles d’intégrité à se terminer plus rapidement.

Important

Les procédures stockées sont automatiquement exclues des contrôles d’intégrité d’entité, car elles nécessitent des paramètres et peuvent ne pas être déterministes.

MCP (entités de nom d’entité)

Parent Property Type Required Default
entities.{entity-name} mcp object ❌ Non activé par défaut lorsqu’il est omis

Contrôle la participation MCP pour l’entité. Lorsque MCP est activé globalement, les entités participent par défaut. Utilisez cette propriété pour désactiver ou activer des outils MCP personnalisés pour les entités de procédure stockée.

Note

La fonctionnalité 2.0 du Générateur d’API de données décrite dans cette section est actuellement en préversion et peut changer avant la disponibilité générale. Pour plus d’informations, consultez Nouveautés de la version 2.0.

Format d’objet

Utilisez le format d’objet pour le contrôle granulaire :

Parent Property Type Required Default
entities.{entity-name}.mcp dml-tools boolean ❌ Non true
entities.{entity-name}.mcp custom-tool boolean ❌ Non false
{
  "entities": {
    "Book": {
      "mcp": {
        "dml-tools": true
      }
    }
  }
}

Outil personnalisé (procédures stockées uniquement)

Pour les entités de procédure stockée, définissez custom-tooltrue pour inscrire la procédure en tant qu’outil MCP nommé :

{
  "entities": {
    "GetBookById": {
      "source": {
        "type": "stored-procedure",
        "object": "dbo.get_book_by_id"
      },
      "mcp": {
        "custom-tool": true
      },
      "permissions": [
        {
          "role": "anonymous",
          "actions": ["execute"]
        }
      ]
    }
  }
}

Important

La custom-tool propriété est valide uniquement pour les entités de procédure stockée. La définition de celle-ci sur une table ou une entité d’affichage entraîne une erreur de configuration.

Exemples CLI

dab add Book --source books --permissions "anonymous:*" --mcp.dml-tools true
dab add GetBookById --source dbo.get_book_by_id --source.type stored-procedure --permissions "anonymous:execute" --mcp.custom-tool true