Compartilhar via


Entities

Configurações para entidades de banco de dados.

Health

Property Description
entities.entity-name.health.enabled Habilita verificações de integridade para a entidade (pontos de extremidade REST e GraphQL)
entities.entity-name.health.first Número de linhas retornadas na consulta de verificação de integridade (intervalo: 1 a 500)
entities.entity-name.health.threshold-ms Duração máxima em milissegundos para consulta de verificação de integridade (min: 1)

Source

Property Description
entities.entity-name.source.type Tipo de objeto: table, viewou stored-procedure
entities.entity-name.source.object Nome do objeto de banco de dados
entities.entity-name.source.parameters Parâmetros para procedimentos ou funções armazenados
entities.entity-name.source.key-fields Lista de campos de chave primária para exibições
entities.entity-name.mappings Mapeia nomes de campo de API para colunas de banco de dados

REST

Property Description
entities.entity-name.rest.enabled Habilita o REST para essa entidade
entities.entity-name.rest.path Rota personalizada para o ponto de extremidade REST
entities.entity-name.rest.methods Métodos REST permitidos: get, , post, put, patch, delete

GraphQL

Property Description
entities.entity-name.graphql.type Nome do tipo ou objeto com singular e plural
entities.entity-name.graphql.operation Tipo de operação: query ou mutation
entities.entity-name.graphql.enabled Habilita o GraphQL para essa entidade

Permissions

Property Description
entities.entity-name.permissions[].role Cadeia de caracteres de nome de função
entities.entity-name.permissions[].actions Um ou mais de: create, , read, update, deleteexecute

Relationships

Property Description
entities.entity-name.relationships.relationship-name.cardinality one ou many
entities.entity-name.relationships.relationship-name.target.entity Nome da entidade de destino
entities.entity-name.relationships.relationship-name.source.fields Campos dessa entidade usados na relação
entities.entity-name.relationships.relationship-name.target.fields Campos da entidade de destino
entities.entity-name.relationships.relationship-name.linking.object Objeto join usado para relações muitos para muitos
entities.entity-name.relationships.relationship-name.linking.source.fields Campos da entidade de origem usados na junção
entities.entity-name.relationships.relationship-name.linking.target.fields Campos da entidade de destino usados na junção

Cache

Property Description
entities.entity-name.cache.enabled Habilita o cache de resposta para a entidade
entities.entity-name.cache.ttl-seconds Tempo de vida útil em cache em segundos

Visão geral do formato

{
  "entities": {
    "{entity-name}": {
      "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>,
        "type": "view" | "stored-procedure" | "table",
        "key-fields": [<string>], // primary keys for the view
        "parameters": { // only for stored-procedure
          "<parameter-name>": <default-value>,
          "<parameter-name>": <default-value>
        }
      },
      "mappings": {
        "<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>
          }
        }
      ]
    }
  }
}

Origem (entidades de nome de entidade)

Parent Property Tipo Required Default
entities.{entity-name} source objeto ✔️ Sim None

Os detalhes da fonte do banco de dados da entidade.

Propriedades aninhadas

Parent Property Tipo Required Default
entities.{entity-name}.source object cadeia ✔️ Sim None
entities.{entity-name}.source type enumeração (table, view, stored-procedure) ✔️ Sim None
entities.{entity-name}.source key-fields Matriz de cadeia de caracteres ✔️ Sim* None
entities.{entity-name}.source parameters objeto ✔️ Sim** None
  • key-fields só é necessário quando type é view. O valor representa as chaves primárias.

** parameters só é necessário quando type é stored-procedure e somente para parâmetros com valores padrão. O tipo de dados do parâmetro é inferido. Parâmetros sem um padrão podem ser omitidos.

Tip

Se o objeto pertencer ao esquema dbo, especificar o esquema será opcional. Além disso, colchetes em torno de nomes de objeto (por exemplo, dbo.Users vs. [dbo].[Users]) podem ser usados quando necessário.

Format

{
  "entities": {
    "{entity-name}": {
      "source": {
        "object": <string>,
        "type": <"view" | "stored-procedure" | "table">,
        "key-fields": [ <string> ], // primary keys of the view
        "parameters": { // only for option stored-procedure parameters
          "<parameter-name-1>": <default-value>
          "<parameter-name-2>": <default-value>
        }
      }
    }
  }
}

Permissões (entidades de nome de entidade)

Parent Property Tipo Required Default
entities.permissions role cadeia ✔️ Sim None

Uma cadeia de caracteres que especifica o nome da função à qual as permissões se aplicam.

Format

{
  "entities": {
    "{entity-name}": {
      "permissions": [
        {
          "role": <"anonymous" | "authenticated" | "custom-role">
        }
      ]
    }
  }
}

Example

Este exemplo define a função custom-role com apenas read permissões na User entidade.

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

Exemplos de uso

GET https://localhost:5001/api/User
Authorization: Bearer <your_access_token>
X-MS-API-ROLE: custom-role

Ações (entidades de nome de entidade de permissões de matriz de cadeia de caracteres)

Parent Property Tipo Required Default
entities.permissions actions oneOf [cadeia de caracteres, matriz] ✔️ Sim None

Uma matriz de cadeia de caracteres que detalha quais operações são permitidas para a função associada.

Action Operação SQL
* Todas as ações
create Inserir uma ou mais linhas*
read Selecionar uma ou mais linhas
update Modificar uma ou mais linhas*
delete Excluir uma ou mais linhas*
execute Executa um procedimento armazenado

* No momento, há suporte para várias operações apenas no GraphQL.

Note

Para procedimentos armazenados, a ação curinga (*) expande-se apenas para a ação execute. Para tabelas e exibições, ele se expande para create, read, updatee delete.

Format

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

Example

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

Formato alternativo (somente cadeia de caracteres, quando type=stored-procedure)

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

Example

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

Ações (entidades de nome de entidade de permissões de matriz de objeto)

Parent Property Tipo Required Default
entities.{entity-name}.permissions actions Matriz de cadeia de caracteres ✔️ Sim None

Uma matriz de objetos que detalha quais operações são permitidas para a função associada.

Note

Para procedimentos armazenados, a ação curinga (*) se expande para apenas execute. Para tabelas/exibições, ele se expande para create, read, updatee delete.

Propriedades aninhadas

Parent Property Tipo Required Default
entities.{entity-name}.permissions.actions[] action cadeia ✔️ Sim None
entities.{entity-name}.permissions.actions[] fields objeto ❌ Não None
entities.{entity-name}.permissions.actions[] policy objeto ❌ Não None
entities.{entity-name}.permissions.actions[].policy database cadeia ✔️ Sim None

Format

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

Example

Isso concede read permissão à auditorUser entidade, com restrições de campo e política.

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

Notas de política

  • As políticas dão suporte a operadores OData como eq.
  • As políticas dão suporte a predicados compostos usando and e or.
  • Só há suporte para ações: create, read, updatee delete. (Não execute)
  • As políticas filtram os resultados, mas não impedem a execução da consulta no banco de dados.
  • O campo deve usar o alias de campo, se mapeado.

Tipo (entidades de nome de entidade do GraphQL)

Parent Property Tipo Required Default
entities.{entity-name}.graphql type objeto ❌ Não {entity-name}

Define a convenção de nomenclatura para uma entidade dentro do esquema GraphQL.

Format

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

Propriedades aninhadas

Parent Property Required Tipo Default
entities.{entity-name}.graphql.type singular ❌ Não cadeia None
entities.{entity-name}.graphql.type plural ❌ Não cadeia N/A (padrão para valor singular)

Example

Configuration

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

Consulta GraphQL

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

Resposta do GraphQL

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

Operação (entidades de nome de entidade do GraphQL)

Parent Property Tipo Required Default
entities.{entity-name}.graphql operation cadeia de caracteres de enumeração ❌ Não mutation

Designa se a stored-procedure operação é exibida sob o Query ou Mutation.

Note

Quando {entity-name}.type é definido como stored-procedure, um novo tipo graphQL executeXXX é criado automaticamente. Essa operation propriedade controla onde esse tipo é colocado no esquema GraphQL. Não há impacto funcional, apenas higiene de esquema.

Format

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

Exemplo: operação

Quando operation é definido como query

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

Quando operation é definido como mutation

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

Habilitado (entidades de nome de entidade do GraphQL)

Parent Property Tipo Required Default
entities.{entity-name}.graphql enabled boolean ❌ Não True

Permite que os desenvolvedores incluam seletivamente entidades no esquema GraphQL.

Format

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

REST (entidades de nome de entidade)

Parent Property Tipo Required Default
entities.{entity-name}.rest enabled boolean ❌ Não True
entities.rest path cadeia ❌ Não /{entity-name}
entities.{entity-name}.rest methods Matriz de cadeia de caracteres ❌ Não* POST

* A methods propriedade é apenas para stored-procedure pontos de extremidade.

Format

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

Mapeamentos (entidades de nome de entidade)

Parent Property Tipo Required Default
entities.{entity-name} mappings objeto ❌ Não None

Habilita aliases personalizados ou nomes expostos para campos de objeto de banco de dados.

Important

Para entidades com GraphQL habilitado, o nome exposto configurado deve atender aos requisitos de nome do 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

Tabela de banco de dados

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

Configuration

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

Cache (entidades de nome de entidade)

Parent Property Tipo Required Default
entities.{entity-name} cache objeto ❌ Não None

Habilita e configura o cache para a entidade.

Propriedades aninhadas

Parent Property Tipo Required Default
entities.{entity-name}.cache enabled boolean ❌ Não False
entities.{entity-name}.cache ttl-seconds inteiro ❌ Não -

Format

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

Note

Quando não especificado, ttl-seconds herda o valor global definido em runtime.cache.

Example

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

Relações (entidades de nome de entidade)

Parent Property Tipo Required Default
entities.{entity-name} relationships objeto ❌ Não None

Configura como as entidades do GraphQL estão relacionadas a outras entidades expostas. Para obter mais informações, consulte divisão de relações do construtor de API de Dados.

Note

A relationship-name propriedade de cada relação deve ser exclusiva em todas as relações dessa entidade.

Propriedades aninhadas

Essas propriedades são usadas em combinações diferentes dependendo da cardinalidade da relação.

Parent Property Tipo Required Default
entities.{entity-name}.relationships cardinality cadeia ✔️ Sim None
entities.{entity-name}.relationships target.entity cadeia ✔️ Sim None
entities.{entity-name}.relationships target.fields Matriz de cadeia de caracteres ❌ Não None
entities.{entity-name}.relationships source.fields Matriz de cadeia de caracteres ❌ Não None
entities.{entity-name}.relationships linking.object cadeia ❌ Não None
entities.{entity-name}.relationships linking.source.fields Matriz de cadeia de caracteres ❌ Não None
entities.{entity-name}.relationships linking.target.fields Matriz de cadeia de caracteres ❌ Não 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 Uma entidade de categoria pode se relacionar com muitas entidades de todo
many-to-one one Muitas entidades de todo podem se relacionar com uma entidade de categoria
many-to-many many Uma entidade todo pode se relacionar com muitas entidades de usuário e uma entidade de usuário pode se relacionar com várias entidades de todo

Exemplo: cardinalidade um-para-um

Cada Profile um está relacionado a exatamente um Usere cada User um tem exatamente um relacionado Profile.

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

Esquema do GraphQL

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

Command-line

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

Exemplo: cardinalidade um-para-muitos

Uma Category pode ter uma ou mais entidades relacionadas Book , enquanto cada Book uma pode ter uma relacionada Category.

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

Esquema do GraphQL

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

Linha de comando

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

Exemplo: cardinalidade muitos para um

Muitas Book entidades podem ter uma relacionada Category, enquanto uma Category pode ter uma ou mais entradas relacionadas Book .

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

Esquema do GraphQL

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

Linha de comando

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

Exemplo: cardinalidade muitos para muitos

Muitas Book entidades podem ter muitas entidades relacionadas Author , enquanto muitas Author entidades podem ter muitas entradas relacionadas Book .

Note

Essa relação é possível com uma terceira tabela, dbo.books_authorsque chamamos de objeto de vinculação.

{
  "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": {
        ...
      }
    }
  }
}

Esquema do GraphQL

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

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

Linha de comando

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"

Integridade (entidades de nome de entidade)

Parent Property Tipo Required Default
entities.{entity-name} health objeto ❌ Não None

Habilita e configura verificações de integridade para a entidade.

Propriedades aninhadas

Parent Property Tipo Required Default
entities.{entity-name}.health enabled boolean ❌ Não true
entities.{entity-name}.health first inteiro ❌ Não 100
entities.{entity-name}.health threshold-ms inteiro ❌ Não 1000

Example

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

Note

O first valor deve ser menor ou igual à configuração runtime.pagination.max-page-size . Valores menores ajudam as verificações de integridade a serem concluídas mais rapidamente.

Important

Os procedimentos armazenados são automaticamente excluídos das verificações de integridade da entidade porque exigem parâmetros e podem não ser determinísticos.