Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Fabric Apps menggunakan dekorator TypeScript untuk menentukan model data yang menghasilkan tabel database dan API. Anda menentukan setiap entitas sebagai kelas yang dihiasi dengan @entity(), tambahkan dekorator bidang untuk jenis data, dan memetakan hubungan antar entitas.
Untuk panduan otorisasi dan kontrol akses, lihat Menentukan izin data.
Prasyarat
- Proyek Fabric Apps yang dibuat dengan
npm create @microsoft/rayfin@latestatau diinisialisasi dengannpx rayfin init. - Pemahaman dasar tentang kelas dan dekorator TypeScript.
Menentukan entitas
Untuk membuat model data, tambahkan @entity() dekorator ke kelas TypeScript. Kemudian impor dekorator yang diperlukan dari @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;
}
Entitas ini menghasilkan Todo tabel dengan kolom untuk id, , title, descriptioncreatedAt, dan updatedAt.
Kunci primer
Setiap entitas menggunakan bidang UUID string bernama id sebagai kunci utamanya. Jika Anda tidak mendeklarasikan id secara eksplisit, Fabric Apps menambahkannya ke skema secara otomatis.
- Bidang
idbersifat opsional selama operasi pembuatan—server menghasilkan UUID jika Anda menghilangkannya. - Anda dapat menyediakan UUID Anda sendiri pada waktu pembuatan jika Anda lebih suka pengidentifikasi yang dihasilkan klien.
- Kunci primer komposit dan nama kunci kustom tidak didukung.
@entity()
export class Note {
@uuid() id!: string; // UUID primary key, auto-generated when omitted
@text() title!: string;
@text() content!: string;
}
Jenis data yang didukung
Gunakan dekorator ini untuk menentukan jenis bidang:
| Dekorator | Tipe | Deskripsi |
|---|---|---|
@uuid() |
string | Bidang pengidentifikasi unik. |
@text() |
string | Bidang teks dengan batasan panjang opsional. |
@int() |
number | Bidang bilangan bulat. |
@decimal() |
number | Bidang desimal atau numerik. |
@boolean() |
Boolean | Bidang benar atau salah. |
@date() |
Date | Bidang tanggal dan waktu, diserialisasi dari string ISO atau objek Date. |
@email() |
string | Bidang teks dengan validasi email. |
@set() |
string | Sekumpulan literal string yang dijumlahkan. |
Contoh dengan beberapa jenis
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';
}
Modifier tipe
Tambahkan pengubah ke dekorator bidang untuk mengonfigurasi validasi dan batasan:
| Pengubah | Deskripsi |
|---|---|
{ optional: true } |
Perbolehkan nilai NULL. Kolom wajib diisi secara bawaan. |
{ unique: true } |
Tambahkan batasan unik. |
{ default: value } |
Atur ekspresi nilai default. |
{ max: n }, { min: n } |
Batasan panjang string (jumlah karakter maksimum dan minimum). |
{ min: n }, { max: n } |
Batasan nilai numerik. |
Nota
Penanda opsional TypeScript (? setelah nama properti) hanya memengaruhi jenis TypeScript statis. Ini tidak menjadikan kolom basis data dapat bernilai null. Untuk membuat kolom dapat bernilai null, tambahkan { optional: true } ke dekorator. Gunakan ! untuk menegaskan bahwa bidang yang diperlukan diinisialisasi oleh kerangka kerja.
Contoh dengan pengubah
@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;
}
Menentukan hubungan
Gunakan @one() dan @many() dekorator untuk menentukan properti navigasi antar entitas. Fabric Apps secara otomatis menghasilkan kolom kunci asing saat Anda menentukan hubungan.
-
Satu-ke-banyak - Gunakan
@many()pada induk dan@one()pada anak. -
Banyak-ke-satu – Gunakan
@one()pada anak untuk merujuk ke induk. - Relasi banyak-ke-banyak tidak didukung—gunakan entitas penghubung eksplisit sebagai gantinya.
Contoh dengan relasi satu-ke-banyak
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;
}
Saat Anda menentukan @one(() => Notebook) pada entitas Note, aplikasi Fabric secara otomatis membuat kolom kunci asing notebook_id. Nyatakan bidang kunci asing secara eksplisit hanya jika Anda berencana untuk membaca atau mengaturnya dalam kode aplikasi.
Konvensi penamaan kunci asing
Saat Anda menentukan bidang kunci asing, gunakan {property}_id konvensi penamaan:
@entity()
export class Note {
@uuid() id!: string;
@text() notebook_id!: string; // Foreign key field
@one(() => Notebook) notebook?: Notebook; // Navigation property
}
Nama kunci asing kustom (foreignKey, targetKey opsi) tidak didukung.
Entitas sistem referensi
Fabric Apps tidak mendukung hubungan @one() yang menunjuk ke entitas sistem seperti entitas USER bawaan. Untuk mengaitkan baris dengan pengguna yang sedang masuk, tambahkan field user_id biasa bertipe @text() dan isi nilainya dari klaim autentikasi (biasanya claims.sub):
@entity()
export class Task {
@uuid() id!: string;
@text() title!: string;
@text() user_id!: string; // System user ID from claims.sub
}
Saring baris berdasarkan user_id dalam kebijakan peran Anda untuk menerapkan kontrol akses per pengguna.
Mendaftarkan entitas dalam skema
Tambahkan semua kelas entitas ke rayfin/data/schema.ts agar klien dapat menghasilkan proksi GraphQL:
import type { Note } from './Note.js';
import type { Notebook } from './Notebook.js';
export type NotesAppSchema = {
Note: Note;
Notebook: Notebook;
};
Perbarui jenis ini setiap kali Anda membuat entitas baru.
Menerapkan perubahan skema
Setelah menentukan atau memodifikasi entitas, terapkan perubahan ke database:
Sebarkan skema yang diperbarui ke Fabric:
npx rayfin up db applyJika perubahan skema mencakup operasi destruktif (menghilangkan kolom, mengganti nama tabel), CLI memperingatkan Anda dan menolak untuk melanjutkan. Gunakan
--forceuntuk mengambil alih pemeriksaan keamanan:npx rayfin up db apply --force
Nota
Menggunakan --force dapat menyebabkan kehilangan data. Tinjau operasi yang tercantum dengan hati-hati sebelum melanjutkan.
Praktik terbaik
- Tentukan bidang kunci asing hanya saat Anda perlu membaca atau mengaturnya dalam kode—Fabric Apps menghasilkannya secara otomatis dari dekorator navigasi.
- Gunakan impor relatif dengan ekstensi
.jspada file entitas agar JavaScript ESM yang dihasilkan dapat diurai dengan benar. - Untuk pola otorisasi dan akses berbasis peran, lihat Menentukan izin data.
Troubleshooting
Relasi yang hilang
Jika hubungan tidak muncul di API, verifikasi bahwa:
- Dekorator navigasi (
@one()atau@many()) ada. - Entitas terdaftar di
rayfin/data/schema.ts.