Sdílet prostřednictvím


Entities

Nastavení konfigurace pro databázové entity

Health

Property Description
entities.entity-name.health.enabled Povolí kontroly stavu pro entitu (koncové body REST i GraphQL).
entities.entity-name.health.first Počet řádků vrácených v dotazu kontroly stavu (rozsah: 1–500)
entities.entity-name.health.threshold-ms Maximální doba trvání v milisekundách pro dotaz kontroly stavu (min: 1)

Source

Property Description
entities.entity-name.source.type Typ objektu: table, viewnebo stored-procedure
entities.entity-name.source.object Název databázového objektu
entities.entity-name.source.parameters Parametry uložených procedur nebo funkcí
entities.entity-name.source.key-fields Seznam polí primárního klíče pro zobrazení
entities.entity-name.mappings Mapuje názvy polí rozhraní API na databázové sloupce.

REST

Property Description
entities.entity-name.rest.enabled Povolí rest pro tuto entitu.
entities.entity-name.rest.path Vlastní trasa pro koncový bod REST
entities.entity-name.rest.methods Povolené metody REST: get, post, putpatch,delete

GraphQL

Property Description
entities.entity-name.graphql.type Zadejte název nebo objekt s singularplural
entities.entity-name.graphql.operation Typ operace: query nebo mutation
entities.entity-name.graphql.enabled Povolí pro tuto entitu GraphQL.

Permissions

Property Description
entities.entity-name.permissions[].role Řetězec názvu role
entities.entity-name.permissions[].actions Jeden nebo více z: create, read, update, deleteexecute

Relationships

Property Description
entities.entity-name.relationships.relationship-name.cardinality one nebo many
entities.entity-name.relationships.relationship-name.target.entity Název cílové entity
entities.entity-name.relationships.relationship-name.source.fields Pole z této entity použité v relaci
entities.entity-name.relationships.relationship-name.target.fields Pole z cílové entity
entities.entity-name.relationships.relationship-name.linking.object Objekt spojení použitý pro relace M:N
entities.entity-name.relationships.relationship-name.linking.source.fields Pole ze zdrojové entity použité ve spojení
entities.entity-name.relationships.relationship-name.linking.target.fields Pole z cílové entity použité při spojení

Cache

Property Description
entities.entity-name.cache.enabled Povolí ukládání odpovědí do mezipaměti pro entitu.
entities.entity-name.cache.ttl-seconds Ukládání do mezipaměti v sekundách

Přehled formátu

{
  "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>
          }
        }
      ]
    }
  }
}

Zdroj (entity s názvem entity)

Parent Property Typ Required Default
entities.{entity-name} source objekt ✔️ Ano None

Podrobnosti o zdroji databáze entity.

Vnořené vlastnosti

Parent Property Typ Required Default
entities.{entity-name}.source object řetězec ✔️ Ano None
entities.{entity-name}.source type enum (table, view, stored-procedure) ✔️ Ano None
entities.{entity-name}.source key-fields Řetězcové pole ✔️ Ano* None
entities.{entity-name}.source parameters objekt ✔️ Ano** None
  • key-fields je vyžadována pouze v případě, že type je view. Hodnota představuje primární klíče.

** parameters je vyžadován pouze v případě, že type jsou stored-procedure parametry s výchozími hodnotami a pouze pro parametry. Datový typ parametru je odvozen. Parametry bez výchozího nastavení je možné vynechat.

Tip

Pokud objekt patří do schématu dbo, je zadání schématu volitelné. Hranaté závorky kolem názvů objektů (například dbo.Users vs. [dbo].[Users]) lze použít v případě potřeby.

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>
        }
      }
    }
  }
}

Oprávnění (entity s názvem entity)

Parent Property Typ Required Default
entities.permissions role řetězec ✔️ Ano None

Řetězec určující název role, na kterou se vztahují oprávnění.

Format

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

Example

Tento příklad definuje roli custom-role pouze read s oprávněními k entitě User .

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

Příklady použití

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

Akce (entity s oprávněními pro pole řetězců)

Parent Property Typ Required Default
entities.permissions actions oneOf [řetězec, pole] ✔️ Ano None

Pole řetězců s podrobnostmi o tom, jaké operace jsou pro přidruženou roli povolené.

Action Operace SQL
* Všechny akce
create Vložení jednoho nebo více řádků*
read Výběr jednoho nebo více řádků
update Úprava jednoho nebo více řádků*
delete Odstranění jednoho nebo více řádků*
execute Spustí uloženou proceduru.

* V GraphQL je aktuálně podporováno více operací.

Note

U uložených procedur se akce se zástupným znakem (*) rozbalí pouze na akci execute. Pro tabulky a zobrazení se rozbalí na create, read, updatea delete.

Format

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

Example

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

Alternativní formát (pouze řetězec, pokud type=stored-procedure)

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

Example

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

Akce (entity s názvem entity oprávnění pole objektů)

Parent Property Typ Required Default
entities.{entity-name}.permissions actions Řetězcové pole ✔️ Ano None

Pole objektů s podrobnostmi o tom, jaké operace jsou pro přidruženou roli povolené.

Note

U uložených procedur se akce se zástupným znakem (*) rozbalí pouze na execute. Pro tabulky a zobrazení se rozbalí na create, read, updatea delete.

Vnořené vlastnosti

Parent Property Typ Required Default
entities.{entity-name}.permissions.actions[] action řetězec ✔️ Ano None
entities.{entity-name}.permissions.actions[] fields objekt ❌ Ne None
entities.{entity-name}.permissions.actions[] policy objekt ❌ Ne None
entities.{entity-name}.permissions.actions[].policy database řetězec ✔️ Ano None

Format

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

Example

Tím se udělí read oprávnění k auditor entitě User s omezeními polí a zásad.

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

Poznámky k zásadám

  • Zásady podporují operátory OData, jako je eq.
  • Zásady podporují složené predikáty používající and a or.
  • Podporováno pouze pro akce: create, read, updatea delete. (Ne execute)
  • Zásady filtruje výsledky, ale nezabrání provádění dotazů v databázi.
  • Pole musí používat alias pole, pokud je namapováno.

Typ (entity s názvem entity GraphQL)

Parent Property Typ Required Default
entities.{entity-name}.graphql type objekt ❌ Ne {entity-name}

Nastaví konvenci vytváření názvů pro entitu ve schématu GraphQL.

Format

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

Vnořené vlastnosti

Parent Property Required Typ Default
entities.{entity-name}.graphql.type singular ❌ Ne řetězec None
entities.{entity-name}.graphql.type plural ❌ Ne řetězec Není k dispozici (výchozí hodnota je singulární hodnota)

Example

Configuration

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

Dotaz GraphQL

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

Odpověď GraphQL

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

Operace (entity s názvem entity GraphQL)

Parent Property Typ Required Default
entities.{entity-name}.graphql operation enum string ❌ Ne mutation

Určuje, zda se stored-procedure operace zobrazí pod položkou Query nebo Mutation.

Note

Pokud {entity-name}.type je nastavená hodnota stored-procedure, automaticky se vytvoří nový typ executeXXX GraphQL. Tato operation vlastnost určuje, kde je tento typ umístěn ve schématu GraphQL. Není žádný funkční dopad, jen hygiena schématu.

Format

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

Příklad: operace

Kdy operation je nastavená hodnota query

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

Kdy operation je nastavená hodnota mutation

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

Povoleno (entity s názvem entity GraphQL)

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

Umožňuje vývojářům selektivně zahrnout entity do schématu GraphQL.

Format

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

REST (entity s názvem entity)

Parent Property Typ Required Default
entities.{entity-name}.rest enabled boolean ❌ Ne True
entities.rest path řetězec ❌ Ne /{entity-name}
entities.{entity-name}.rest methods Řetězcové pole ❌ Ne* POST

* Vlastnost methods je určena pouze pro stored-procedure koncové body.

Format

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

Mapování (entity s názvem entity)

Parent Property Typ Required Default
entities.{entity-name} mappings objekt ❌ Ne None

Povolí pro pole databázových objektů vlastní aliasy nebo vystavené názvy.

Important

U entit s povoleným GraphQL musí nakonfigurovaný vystavený název splňovat požadavky na název 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

Tabulka databáze

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

Configuration

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

Mezipaměť (entity s názvem entity)

Parent Property Typ Required Default
entities.{entity-name} cache objekt ❌ Ne None

Povolí a nakonfiguruje ukládání do mezipaměti pro entitu.

Vnořené vlastnosti

Parent Property Typ Required Default
entities.{entity-name}.cache enabled boolean ❌ Ne False
entities.{entity-name}.cache ttl-seconds integer ❌ Ne -

Format

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

Note

Pokud nezadáte, ttl-seconds zdědí globální hodnotu nastavenou v části runtime.cache.

Example

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

Relace (entity s názvem entity)

Parent Property Typ Required Default
entities.{entity-name} relationships objekt ❌ Ne None

Konfiguruje, jak entity GraphQL souvisejí s dalšími vystavené entitami. Další informace najdete v tématu rozpis relací tvůrce rozhraní Data API.

Note

Vlastnost relationship-name pro každou relaci musí být pro každou entitu jedinečná.

Vnořené vlastnosti

Tyto vlastnosti se používají v různých kombinacích v závislosti na kardinalitě relace.

Parent Property Typ Required Default
entities.{entity-name}.relationships cardinality řetězec ✔️ Ano None
entities.{entity-name}.relationships target.entity řetězec ✔️ Ano None
entities.{entity-name}.relationships target.fields Řetězcové pole ❌ Ne None
entities.{entity-name}.relationships source.fields Řetězcové pole ❌ Ne None
entities.{entity-name}.relationships linking.object řetězec ❌ Ne None
entities.{entity-name}.relationships linking.source.fields Řetězcové pole ❌ Ne None
entities.{entity-name}.relationships linking.target.fields Řetězcové pole ❌ Ne 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 Jedna entita kategorie může souviset s mnoha entitami úkolů.
many-to-one one Mnoho entit úkolů může souviset s jednou entitou kategorie.
many-to-many many Jedna entita úkolů může souviset s mnoha entitami uživatelů a jedna entita uživatele může souviset s mnoha entitami úkolů.

Příklad: Kardinalita 1:1

Každý Profile souvisí s přesně jedním Usera každý User má přesně jeden související 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"

Příklad: Kardinalita 1:N

A Category může mít jednu nebo více souvisejících Book entit, zatímco každá z nich Book může mít jednu související 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]!
}

Příkazový řádek

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

Příklad: Kardinalita M:1

Mnoho Book entit může mít jednu související Category, zatímco Category může mít jednu nebo více souvisejících Book položek.

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

Příkazový řádek

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

Příklad: Kardinalita M:N

Mnoho Book entit může mít mnoho souvisejících Author entit, zatímco mnoho Author entit může mít mnoho souvisejících Book položek.

Note

Tato relace je možná s třetí tabulkou, dbo.books_authorskterou označujeme jako odkazující objekt.

{
  "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]!
}

Příkazový řádek

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"

Stav (entity s názvem entity)

Parent Property Typ Required Default
entities.{entity-name} health objekt ❌ Ne None

Povolí a nakonfiguruje kontroly stavu pro entitu.

Vnořené vlastnosti

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

Example

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

Note

Hodnota first musí být menší nebo rovna runtime.pagination.max-page-size nastavení. Menší hodnoty pomáhají rychleji provádět kontroly stavu.

Important

Uložené procedury jsou automaticky vyloučeny z kontrol stavu entit, protože vyžadují parametry a nemusí být deterministické.