Adatmodellek definiálása Fabric-alkalmazásokhoz

Fabric Alkalmazások TypeScript-dekorátorokkal definiálják az adatbázistáblákat és API-kat létrehozó adatmodelleket. Az egyes entitásokat @entity() dekorált osztályokként definiálja, adjon hozzá meződekorátorokat az adattípusokhoz, és képezze le az entitások közötti kapcsolatokat.

Az engedélyezéssel és hozzáférés-vezérléssel kapcsolatos útmutatásért tekintse meg az adatengedélyek definiálása című témakört.

Prerequisites

  • A npm create @microsoft/rayfin@latest létrehozott vagy a npx rayfin init inicializált Fabric Apps-projekt.
  • A TypeScript osztályok és dekorátorok alapszintű ismerete.

Entitás definiálása

Adatmodell létrehozásához adja hozzá a @entity() dekorátort egy TypeScript-osztályhoz. Ezután importálja a szükséges dekorátorokat a következőből @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;
}

Ez az entitás létrehoz egy táblát Todo , amely oszlopokat tartalmaz a következőhöz id: , title, description, createdAtés updatedAt.

Elsődleges kulcsok

Minden entitás elsődleges kulcsként elnevezett string UUID-mezőt id használ. Ha nem deklarálja id explicit módon, Fabric Apps automatikusan hozzáadja a sémához.

  • A id mező nem kötelező a létrehozási műveletek során – ha kihagyja, a kiszolgáló létrehoz egy UUID azonosítót.
  • A létrehozáskor saját UUID-t is megadhat, ha az ügyfél által létrehozott azonosítókat részesíti előnyben.
  • Az összetett elsődleges kulcsok és az egyéni kulcsnevek nem támogatottak.
@entity()
export class Note {
  @uuid() id!: string;  // UUID primary key, auto-generated when omitted
  @text() title!: string;
  @text() content!: string;
}

Támogatott adattípusok

Az alábbi dekorátorok használatával definiálhat mezőtípusokat:

Lakberendező Típus Leírás
@uuid() karakterlánc Egyedi azonosító mező.
@text() karakterlánc Szövegmező opcionális hosszkorlátozásokkal.
@int() szám Egész szám mező.
@decimal() szám Decimális vagy numerikus mező.
@boolean() boolean Igaz vagy hamis mező.
@date() Date Dátum- és időmező, ISO-sztringekből vagy Date objektumokból szerializálva.
@email() karakterlánc Szövegmező e-mail-ellenőrzéssel.
@set() karakterlánc Sztringliterálok felsorolt halmaza.

Példa több típussal

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

Típusmódosítók

Módosítók hozzáadása a meződíszítőkhöz az ellenőrzés és a korlátozások konfigurálásához:

Módosító Leírás
{ optional: true } NULL értékek engedélyezése. A mezők alapértelmezés szerint kötelezőek.
{ unique: true } Adjon hozzá egy egyedi korlátozást.
{ default: value } Alapértelmezett értékkifejezés beállítása.
{ max: n }, { min: n } Sztringhossz-korlátozások (karakterek maximális és minimális száma).
{ min: n }, { max: n } Numerikus értékkorlátozások.

Megjegyzés:

A TypeScript opcionális jelölője (? tulajdonságnév után) csak a statikus TypeScript-típusra van hatással. Nem teszi null értékűvé az adatbázis oszlopát. Ha egy mezőt null értékűvé szeretne tenni, adja hozzá { optional: true } a dekorátorhoz. Annak megállapítására használható ! , hogy a keretrendszer inicializálja a szükséges mezőt.

Példa módosítókkal

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

Kapcsolatok definiálása

Használja a @one() és @many() dekorátorokat az entitások közötti navigációs tulajdonságok meghatározásához. Fabric Alkalmazások automatikusan létrehoznak külső kulcsoszlopokat a kapcsolatok definiálásakor.

  • Egy-a-többhöz kapcsolat – A szülőn használja a(z) @many() elemet, a gyermeken pedig a(z) @one() elemet.
  • Több-egyhez – Használja a(z) @one() elemet, hogy a gyermekben a szülőre hivatkozzon.
  • A több-a-többhöz kapcsolat nem támogatott – használjon helyette explicit kapcsoló entitást.

Példa egy-a-többhöz kapcsolatra

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

Amikor a @one(() => Notebook) elemet a Note entitáson meghatározza, a Fabric Apps automatikusan létrehoz egy notebook_id idegen kulcsot tartalmazó oszlopot. Az idegenkulcs-mezőt csak akkor deklarálja explicit módon, ha azt az alkalmazáskódban szeretné olvasni vagy beállítani.

Idegen kulcs elnevezési szabálya

Idegenkulcs-mező definiálásakor használja az {property}_id elnevezési konvenciót:

@entity()
export class Note {
  @uuid() id!: string;
  @text() notebook_id!: string;      // Foreign key field
  @one(() => Notebook) notebook?: Notebook;  // Navigation property
}

Az egyéni idegen kulcsnevek (foreignKeybeállítások targetKey ) nem támogatottak.

Referenciarendszer-entitások

Fabric Az alkalmazások nem támogatják a @one() olyan kapcsolatokat, amelyek olyan rendszerentitásokra mutatnak, mint például a beépített USER entitás. Ha egy sort szeretne társítani a bejelentkezett felhasználóval, adjon hozzá egy egyszerű user_id típusú @text() mezőt, és töltse ki a hitelesítési jogcímekből (általában claims.sub):

@entity()
export class Task {
  @uuid() id!: string;
  @text() title!: string;
  @text() user_id!: string;  // System user ID from claims.sub
}

Szűrje a sorokat user_id alapján a szerepkörházirendekben a felhasználónkénti hozzáférés kikényszerítéséhez.

Entitások regisztrálása a sémában

Adja hozzá az összes entitásosztályt, hogy rayfin/data/schema.ts az ügyfél létrehozhassa a GraphQL-proxykat:

import type { Note } from './Note.js';
import type { Notebook } from './Notebook.js';

export type NotesAppSchema = {
  Note: Note;
  Notebook: Notebook;
};

Frissítse ezt a típust, amikor új entitást hoz létre.

Séma módosítások alkalmazása

Az entitások definiálása vagy módosítása után alkalmazza a módosításokat az adatbázisra:

  1. Telepítse a frissített sémát a Fabricba:

    npx rayfin up db apply
    
  2. Ha a sémamódosítás romboló műveleteket (oszlopok elvetését, táblák átnevezését) tartalmaz, a parancssori felület figyelmezteti Önt, és nem hajlandó továbblépni. A biztonsági ellenőrzés felülbírálásához használja a(z) --force elemet:

    npx rayfin up db apply --force
    

Megjegyzés:

A használat --force adatvesztést okozhat. A folytatás előtt alaposan tekintse át a felsorolt műveleteket.

Bevált gyakorlatok

  • Csak akkor definiálhat idegenkulcs-mezőket, ha kódban kell olvasnia vagy beállítania őket – Fabric Az alkalmazások automatikusan generálják őket a navigációs dekorátorokból.
  • Relatív importálást használjon bővítményekkel .js az entitásfájlokban, hogy a kibocsátott ESM JavaScript megfelelően oldódjon fel.
  • Az engedélyezési mintákról és a szerepköralapú hozzáférésről az adatengedélyek definiálása című témakörben olvashat.

Hibaelhárítás

Hiányzó kapcsolatok

Ha a kapcsolatok nem jelennek meg az API-ban, ellenőrizze, hogy:

  • A navigációs dekorátor (@one() vagy @many()) jelen van.
  • Az entitás regisztrálva van a következőben rayfin/data/schema.ts: .