Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Fabric Apps maakt gebruik van TypeScript-decorators om gegevensmodellen te definiëren die databasetabellen en API's genereren. U definieert elke entiteit als een klasse met @entity(), voegt veld decorators toe voor gegevenstypen en wijst relaties tussen entiteiten toe.
Zie Gegevensmachtigingen definiëren voor richtlijnen voor autorisatie- en toegangsbeheer.
Prerequisites
- Een Fabric Apps-project gemaakt met
npm create @microsoft/rayfin@latestof geïnitialiseerd metnpx rayfin init. - Basiskennis van TypeScript-klassen en decorators.
Een entiteit definiëren
Als u een gegevensmodel wilt maken, voegt u de @entity() decorator toe aan een TypeScript-klasse. Importeer vervolgens de vereiste decorators uit @microsoft/rayfin-core:
import { entity, uuid, text, date } from '@microsoft/rayfin-core';
@entity()
export class Todo {
@uuid() id!: string;
@text() title!: string;
@text({ optional: true }) description?: string;
@date() createdAt!: Date;
@date() updatedAt!: Date;
}
Deze entiteit genereert een Todo tabel met kolommen voor id, title, descriptionen createdAtupdatedAt.
Primaire sleutels
Elke entiteit gebruikt een UUID-veld string met de naam id als primaire sleutel. Als u id niet expliciet declareert, voegt Fabric Apps deze automatisch toe aan het schema.
- Het
idveld is optioneel tijdens het maken van bewerkingen. De server genereert een UUID als u dit weglaat. - U kunt bij het aanmaken uw eigen UUID opgeven als u de voorkeur geeft aan door de client gegenereerde identificatoren.
- Samengestelde primaire sleutels en aangepaste sleutelnamen worden niet ondersteund.
@entity()
export class Note {
@uuid() id!: string; // UUID primary key, auto-generated when omitted
@text() title!: string;
@text() content!: string;
}
Ondersteunde gegevenstypen
Gebruik deze decorators om veldtypen te definiëren:
| Decorateur | Type | Beschrijving |
|---|---|---|
@uuid() |
touw | Uniek id-veld. |
@text() |
touw | Tekstveld met optionele lengtebeperkingen. |
@int() |
nummer | Veld voor gehele getallen. |
@decimal() |
nummer | Veld voor decimalen of getallen. |
@boolean() |
boolean | Waar- of onwaarveld. |
@date() |
Datum | Datum- en tijdveld, serialiseert van ISO-tekenreeksen of Date -objecten. |
@email() |
touw | Tekstveld met e-mailvalidatie. |
@set() |
touw | Opgesomde verzameling van tekenreeksconstanten. |
Voorbeeld met meerdere typen
import { entity, uuid, text, int, decimal, boolean, date, set } from '@microsoft/rayfin-core';
@entity()
export class Product {
@uuid() id!: string;
@text() name!: string;
@decimal() price!: number;
@int() stockQuantity!: number;
@boolean() isAvailable!: boolean;
@date() createdAt!: Date;
@set('draft', 'published', 'archived') status!: 'draft' | 'published' | 'archived';
}
Typemodificatoren
Voeg modifiers toe aan veld decorators om validatie en beperkingen te configureren:
| Wijziger | Beschrijving |
|---|---|
{ optional: true } |
NULL-waarden toestaan. Velden zijn standaard vereist. |
{ unique: true } |
Voeg een unieke beperking toe. |
{ default: value } |
Stel een standaardwaardeexpressie in. |
{ max: n }, { min: n } |
Beperkingen voor tekenreekslengte (maximum- en minimumaantal tekens). |
{ min: n }, { max: n } |
Beperkingen voor numerieke waarden. |
Opmerking
De optionele TypeScript-markering (? na een eigenschapsnaam) is alleen van invloed op het statische TypeScript-type. Hierdoor gaat de databasekolom geen NULL-waarden toestaan. Als u een veld nullbaar wilt maken, voegt u { optional: true } toe aan de decorator. Gebruik ! dit om te bevestigen dat een vereist veld wordt geïnitialiseerd door het framework.
Voorbeeld met modifiers
@entity()
export class User {
@uuid() id!: string;
@email({ unique: true }) email!: string;
@text({ min: 3, max: 50 }) username!: string;
@text({ optional: true, max: 500 }) bio?: string;
@int({ min: 0, max: 150 }) age!: number;
@boolean({ default: false }) isVerified!: boolean;
}
Relaties definiëren
Gebruik @one() en @many() decorators om navigatie-eigenschappen tussen entiteiten te definiëren. Fabric Apps genereert automatisch kolommen met externe sleutels wanneer u relaties definieert.
-
Een-op-veel - gebruik
@many()op het bovenliggende item en@one()op het kind. -
Veel-op-één – Gebruik
@one()op het kind om naar het bovenliggende item te verwijzen. - Veel-op-veel-relaties worden niet ondersteund. Gebruik in plaats daarvan een expliciete join-entiteit.
Voorbeeld met een-op-veel-relatie
import { entity, uuid, text, date, one, many } from '@microsoft/rayfin-core';
@entity()
export class Notebook {
@uuid() id!: string;
@text() name!: string;
@date() createdAt!: Date;
@many(() => Note) notes?: Note[];
}
@entity()
export class Note {
@uuid() id!: string;
@text() title!: string;
@text() content!: string;
@date() createdAt!: Date;
@text() notebook_id!: string;
@one(() => Notebook) notebook?: Notebook;
}
Wanneer u @one(() => Notebook) definieert op de entiteit Note, maakt Fabric Apps automatisch een foreign key-kolom notebook_id. Definieer het veld voor de vreemde sleutel alleen expliciet als u van plan bent dit in de applicatiecode te lezen of in te stellen.
Naamgevingsconventie voor externe sleutels
Wanneer u een veld met een externe sleutel definieert, gebruikt u de {property}_id naamgevingsconventie:
@entity()
export class Note {
@uuid() id!: string;
@text() notebook_id!: string; // Foreign key field
@one(() => Notebook) notebook?: Notebook; // Navigation property
}
Aangepaste namen voor vreemde sleutels (foreignKey, targetKey opties) worden niet ondersteund.
Referentiesysteementiteiten
Fabric Apps biedt geen ondersteuning voor @one()-relaties die verwijzen naar systeementiteiten zoals de ingebouwde entiteit USER. Als u een rij wilt koppelen aan de aangemelde gebruiker, voegt u een gewoon user_id veld van het type @text() toe en vult u deze in vanuit de verificatieclaims (meestal claims.sub):
@entity()
export class Task {
@uuid() id!: string;
@text() title!: string;
@text() user_id!: string; // System user ID from claims.sub
}
Filter rijen op user_id in uw rolbeleidsregels om toegang per gebruiker af te dwingen.
Entiteiten registreren in het schema
Voeg alle entiteitsklassen toe zodat rayfin/data/schema.ts de client GraphQL-proxy's kan genereren:
import type { Note } from './Note.js';
import type { Notebook } from './Notebook.js';
export type NotesAppSchema = {
Note: Note;
Notebook: Notebook;
};
Werk dit type bij wanneer u een nieuwe entiteit maakt.
Schemawijzigingen toepassen
Nadat u entiteiten hebt gedefinieerd of gewijzigd, past u de wijzigingen toe op de database:
Implementeer het bijgewerkte schema in Fabric:
npx rayfin up db applyAls de schemawijziging destructieve bewerkingen bevat (kolommen verwijderen, tabellen een andere naam geven), waarschuwt de CLI u en weigert u verder te gaan. Gebruik
--forcedit om de veiligheidscontrole te overschrijven:npx rayfin up db apply --force
Opmerking
Het gebruik --force kan leiden tot gegevensverlies. Bekijk de vermelde bewerkingen zorgvuldig voordat u doorgaat.
Beste praktijken
- Definieer velden voor externe sleutels alleen wanneer u ze in code moet lezen of instellen—Fabric Apps genereert ze automatisch op basis van navigatiedecorators.
- Gebruik relatieve importbewerkingen met
.jsextensies in entiteitsbestanden, zodat het verzonden ESM JavaScript correct wordt omgezet. - Zie Gegevensmachtigingen definiëren voor autorisatiepatronen en op rollen gebaseerde toegang.
Troubleshooting
Ontbrekende relaties
Als relaties niet worden weergegeven in de API, controleert u of:
- De navigatiedecorator (
@one()of@many()) is aanwezig. - De entiteit is geregistreerd in
rayfin/data/schema.ts.